[PHP] simplexml_load_fileが妙に遅いときがある

WEB上にあるとあるXMLを読み込むのに、以下のようにやると非常に遅い。

simplexml_load_fileを使ってXMLを読み込む

$xml = simplexml_load_file('http://hoge.com/sample.xml');
(5.019sec)


んー…


XMLを提供している側のせいかだろうかと思いつつ、simplexml_load_fileを使うのを止めて代わりにPEAR:HTTP_Client+simplexml_load_stringを使って以下のように変えてみたらば。

HTTP_Clientを使ってXMLを読み込む

require_once 'HTTP/Client.php';
$client = new HTTP_Client();
$client->get('http://hoge.com/sample.xml');
$response = $client->currentResponse();
$xml = simplexml_load_string($response['body']);
var_dump($xml);
(0.040sec)

超速い!なんぞ。キャッシュも関係ないっぽい。



読み込むXMLのサイズが大きくなるとSimpleXMLは重くなるという噂を聞いたので、対象とするXMLを変えてみる。

ニコニコ動画APIの場合

  • simplexml_load_fileを使ってXMLを読み込む → 0.131sec
  • HTTP_Clientを使ってXMLを読み込む → 0.014sec

Tumblr APIの場合

  • simplexml_load_fileを使ってXMLを読み込む → 0.841sec
  • HTTP_Clientを使ってXMLを読み込む → 0.709sec

ほぼ日のRSSの場合

  • simplexml_load_fileを使ってXMLを読み込む → 0.028sec
  • HTTP_Clientを使ってXMLを読み込む → 0.018sec

このブログの場合

  • simplexml_load_fileを使ってXMLを読み込む → 0.883sec
  • HTTP_Clientを使ってXMLを読み込む → 0.640sec



…。

simplexml_load_fileの方が遅いのは変わらないけれども、それほど極端な差じゃないな。
あと形式によっても全然違う。
何か書式に問題があるのかなぁ。




暫定的な結論

どうして先に書いたような差が生まれてるのかよく分からないけど、とりあえずPEAR:HTTP_Client+simplexml_load_stringで改善できるのならってことでそっちを使うことにする。謎だ。