PHPのfile_get_contents()が激重だった… ⇒ cURLへ変更
アマゾンにアクセスして書誌情報を取得するスクリプトを書いていたら、Rubyの場合はけっこうサクサク動くのにPHPだと、1件の情報を取得するのにも10数秒かかったりと動きがもっさりしていた。
それぞれ、使っているライブラリやらアマゾンで取得する情報の量の大小などであって動作に違いがあるのかと思っていたが、PHP側で情報取得に使っていた@simplexml_load_file()が内部的にfile_get_contents()を呼び出して?いて、それが激重だったらしい…。
該当部分をcURLでの取得処理に変えてみた。
処理時間を計測してみたのがこちら:
(1件の検索を4回)×2回繰り返した場合
方法 | 時間 | 総時間 | |
---|---|---|---|
1. | cURL | 27秒+34秒 | 1分1秒 |
2. | simplexml_load_file | 2分3秒+1分33秒 | 3分36秒 |
3. | simplexml_load_string + file_get_contents | 2分13秒+1分39秒 | 3分52秒 |
前にcURLに切り替えた際にはせいぜい時間は2/3になるかならないか程度かなと思っていたが、今回測ってみるとなんと約1/4になっていた!
file_get_contents()遅過ぎ…。
リンク
- file_get_contents 遅い – Google 検索
- php – file_get_contentsとcurlとHttpRequestの違いについて – スタック・オーバーフロー
- PHPメモ : file_get_contentsの代替にcURLを使う – Mach3.laBlog
- APIなどにfile_get_contents()を使うのはオススメしない理由と代替案
- file_get_contentsが遅い | MacBSの日常生活的日記
- 速度のボトルネックを調べると、やはり情報を取得してる部分、要するにfile_get_contents()が遅いのがわかりました。
- curlだとちょっと早いらしいので、まずはこれに変えてみますが、せいぜい2倍速くらい。
- さらに調べると、multiRequestというのがあるんですね。要は複数のリクエストを並行して投げるものです。これを使えばスピードは一気にcurlの4倍くらいになりました。
- file_get_contentsよりcurlを使ったほうがいいメモ | The Graphic to Web
- file_get_contentsよりもcURLのほうが速かった
- [PHP] simplexml_load_fileが妙に遅いときがある | mutter
- simplexml_load_fileを使うのを止めて代わりにPEAR:HTTP_Client+simplexml_load_stringを使って以下のように変えてみたらば。超速い!なんぞ。キャッシュも関係ないっぽい。