• ベストアンサー

◆速い、ファイル読み込みは?

いつもお世話になっております。 $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);

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

file()が遅いというか、httpでアクセスするのですからオーバーヘッドが あるのは仕方ないでしょう。 もし気になるようであればPEARのHTTP_Requestなどで処理してみては いかがでしょうか? また、並行処理的な手法でアプローチするのも手かもしれません

gogovamos
質問者

補足

>また、並行処理的な手法でアプローチするのも手かもしれません バックエンド側でfile()を実行させるということでしょうか?

その他の回答 (5)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.6

どんな案件か知らないので具体的にはあれですけど、 結局やることがDLとページ検索なら HyperEstraierでもいれて、DLと検索両方やらせては?と思いました。 自前サーバで実行時間に問題ないならPHPでもいいと思いますが PHPの通信はあまり信用してないのでPHPのcurl関数?とか使用しては?という意味です。 先にDLしてても1000ファイルの文字検索だとまだ時間かかるのでは? 単に集計用途で週1回のアクセスとかならもうそのままでもいいと思いますが、 やっぱり目的が不明なのでなんとも。

gogovamos
質問者

補足

環境はPHP + (一応Mysqlと自前サーバです)。 (1)あるサイトの全自リンクを全て取得。 (2)そのURLリストを解析し、検索単語を見つける。 (3)そのURLを抜き出す。 (2)(3)の時に時間を要していたので、今回の質問に至りました。 皆さんのアドバイスを受け、バックエンドでの処理を考えています。 1000ファイル以上の検索でも、バックエンド側ならある程度時間がかかってもサーバのタイムアウト等の心配はない(ですよね...)。 PHPはかじる程度でしたので、今回の質問で色々勉強になりました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

クローラとかでよいならそれこそ、シェルでwgetでも定期的に 走らせればよいのでは?

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.4

#3 あら、HTTP通信の話でしたか? PHP実行1発で1000のURLにアクセスするのはきつい仕様ですね。 タイムアウトがきかない環境であれば異常に時間もかかります。 libcurlとか多言語を使うとか、並列で取得しにいくとか、 外部のクローラとかで先にDLしておくとか。

gogovamos
質問者

補足

>libcurlとか多言語を使うとか、並列で取得しにいくとか、 バックエンドで処理するということでしょうか? >外部のクローラとかで先にDLしておくとか。 こちらの詳細を教えていただけますか?

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.3

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)
回答No.2

ある単語を探す部分に、正規表現を使うと、 その分付加がかかります。可能なら 単純なSTR処理関数に置き換えれば、早くなるかも(保障無し) <ベンチマークテストが必要>

関連するQ&A