- ベストアンサー
◆速い、ファイル読み込みは?
いつもお世話になっております。 $all_listには1000以上のURLが含まれています。 それを1ページずつ読み込みある単語を探すという処理を作っています。 しかし、file関数が遅い。。。その為、サーバがダウンしないか心配。 phpのfile関数は極端に遅いという事が他の書き込みでもあるのですが、他に良い関数や他の方法のアイディアがある方がいればご教授下さい。 fopen等も試してみましたが。。。 for($a = 0; $a < ($num - 1); $a++) { $html = @file("$all_list[$a]"); if($html){ foreach( $html as $key => $value ){ $rcd = ereg("$search", $value); if($rcd){ $INFO[][url] = $all_list[$a] } } } } @fclose($html);
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
file()が遅いというか、httpでアクセスするのですからオーバーヘッドが あるのは仕方ないでしょう。 もし気になるようであればPEARのHTTP_Requestなどで処理してみては いかがでしょうか? また、並行処理的な手法でアプローチするのも手かもしれません
その他の回答 (5)
- tany180sx
- ベストアンサー率63% (239/379)
どんな案件か知らないので具体的にはあれですけど、 結局やることがDLとページ検索なら HyperEstraierでもいれて、DLと検索両方やらせては?と思いました。 自前サーバで実行時間に問題ないならPHPでもいいと思いますが PHPの通信はあまり信用してないのでPHPのcurl関数?とか使用しては?という意味です。 先にDLしてても1000ファイルの文字検索だとまだ時間かかるのでは? 単に集計用途で週1回のアクセスとかならもうそのままでもいいと思いますが、 やっぱり目的が不明なのでなんとも。
補足
環境はPHP + (一応Mysqlと自前サーバです)。 (1)あるサイトの全自リンクを全て取得。 (2)そのURLリストを解析し、検索単語を見つける。 (3)そのURLを抜き出す。 (2)(3)の時に時間を要していたので、今回の質問に至りました。 皆さんのアドバイスを受け、バックエンドでの処理を考えています。 1000ファイル以上の検索でも、バックエンド側ならある程度時間がかかってもサーバのタイムアウト等の心配はない(ですよね...)。 PHPはかじる程度でしたので、今回の質問で色々勉強になりました。
- yambejp
- ベストアンサー率51% (3827/7415)
クローラとかでよいならそれこそ、シェルでwgetでも定期的に 走らせればよいのでは?
- tany180sx
- ベストアンサー率63% (239/379)
#3 あら、HTTP通信の話でしたか? PHP実行1発で1000のURLにアクセスするのはきつい仕様ですね。 タイムアウトがきかない環境であれば異常に時間もかかります。 libcurlとか多言語を使うとか、並列で取得しにいくとか、 外部のクローラとかで先にDLしておくとか。
補足
>libcurlとか多言語を使うとか、並列で取得しにいくとか、 バックエンドで処理するということでしょうか? >外部のクローラとかで先にDLしておくとか。 こちらの詳細を教えていただけますか?
- tany180sx
- ベストアンサー率63% (239/379)
file()は配列を生成する分遅いのは仕方ないかと。 へぼPCでベンチマークに挑戦。 データは 100文字x1000行x4ファイル 1. file() 2. fopen() fread() 3. readfile() ob_get_contents() 4. include() //データ形式は <?php return ''; 普通はfopenでいいと思いますが、データ更新より読み込みの方が多いのであれば、 4. みたいにキャッシュ的なことをするのが速度改善になるかと。 <?php for ($i = 1, $data = ''; $i<= 4 ; $i++) { if ($mode == 1) { // 0.0330sec $file = 'data/data' . $i . '.dat'; $tmp = file($file); $data .= implode('', $tmp); } else if ($mode == 2) { // 0.0082sec $file = 'data/data' . $i . '.dat'; $fp = fopen($file, 'r'); while (!feof($fp)) { $data .= fread($fp, 8192); } fclose($fp); } else if ($mode == 3) { // 0.0099sec $file = 'data/data' . $i . '.dat'; //ob_start(); readfile($file); $data .= ob_get_contents(); ob_clean(); } else if ($mode == 4) { // 0.0062sec $file = 'data2/data' . $i . '.dat'; $data .= include $file; } }
- yyr446
- ベストアンサー率65% (870/1330)
ある単語を探す部分に、正規表現を使うと、 その分付加がかかります。可能なら 単純なSTR処理関数に置き換えれば、早くなるかも(保障無し) <ベンチマークテストが必要>
補足
>また、並行処理的な手法でアプローチするのも手かもしれません バックエンド側でfile()を実行させるということでしょうか?