2016-04-05 7 views
0

外部RSSフィードの最新エントリをページに表示する必要があります。 私はキャッシュファイルを使用するシンプルなRSSリーダーを作った。PHP:DOMDocument :: load():I/O警告:外部エンティティ(外部RSSフィードおよびキャッシュファイル)の読み込みに失敗しました

それは完全に私のテスト環境で動作しますが、私は私のウェブサイト上に置いたとき、私はエラーにキャッシュファイルが書き込まれていないすべての時間を得た:

警告:のDOMDocument ::負荷():I/O警告:.../index.phpの外部エンティティ ".../rssRadio.xml.cache"を45行目に読み込めませんでした。

これはページのコードです。ライン45、それは最後の一つだ:私はページをリロードした場合

 $cacheName = 'cache/rss.xml.cache'; 
     $ageInSeconds = (3600*2); // two hour 
     if(!file_exists($cacheName) || filemtime($cacheName) < time() - $ageInSeconds) { 
      $contents = file_get_contents($RSSURL); 
      file_put_contents($cacheName, $contents); 
     } 
     $rss = new DOMDocument(); 
     if (!$rss->load($cacheName)) { 
      throw new Exception('Impossibile caricare i podcast'); 
     } 
     $feed = array(); 
     foreach ($rss->getElementsByTagName('item') as $node) { 

...

、エラーがなくなっていると、コンテンツは、それが示されていますので、キャッシュファイルが正常に動作します。

file_put_contents呼び出しが終了する前に、スクリプトがキャッシュファイルを読み取ろうとしているように見えます。しかし、これは不可能です。なぜなら、これは入出力I/O呼び出しをブロックするからです...そうですか? アイデア

乾杯お待ちください

答えて

1

この問題はおそらく、サーバー遅延のインデックスツリーを更新することにあります。 file_put_contentsの後にusleep(100);を追加して解決できます。

しかし、私の意見では、最善の解決策は、このようなものです:

if(!file_exists($cacheName) || filemtime($cacheName) < time() - $ageInSeconds) 
{ 
    $contents = file_get_contents($RSSURL); 
    file_put_contents($cacheName, $contents); 
} 
else 
{ 
    $contents = file_get_contents($cacheName); 
} 
$rss = new DOMDocument(); 
if(!$rss->loadXML($contents)) 
{ 
    throw new Exception('Impossibile caricare i podcast'); 
} 

このところで、あなたは、ファイルの代わりに文字列を読み込み、そして、あなたのスクリプトが正常に動作します。

+0

私は自分でそれを理解していないと信じられません... ありがとうございました。 –

関連する問題