重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

いつもお世話になっております。

$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);

A 回答 (6件)

file()が遅いというか、httpでアクセスするのですからオーバーヘッドが


あるのは仕方ないでしょう。

もし気になるようであればPEARのHTTP_Requestなどで処理してみては
いかがでしょうか?

また、並行処理的な手法でアプローチするのも手かもしれません

この回答への補足

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

補足日時:2008/12/10 13:43
    • good
    • 0

どんな案件か知らないので具体的にはあれですけど、


結局やることがDLとページ検索なら
HyperEstraierでもいれて、DLと検索両方やらせては?と思いました。

自前サーバで実行時間に問題ないならPHPでもいいと思いますが
PHPの通信はあまり信用してないのでPHPのcurl関数?とか使用しては?という意味です。

先にDLしてても1000ファイルの文字検索だとまだ時間かかるのでは?

単に集計用途で週1回のアクセスとかならもうそのままでもいいと思いますが、
やっぱり目的が不明なのでなんとも。

この回答への補足

環境はPHP + (一応Mysqlと自前サーバです)。

(1)あるサイトの全自リンクを全て取得。
(2)そのURLリストを解析し、検索単語を見つける。
(3)そのURLを抜き出す。

(2)(3)の時に時間を要していたので、今回の質問に至りました。

皆さんのアドバイスを受け、バックエンドでの処理を考えています。
1000ファイル以上の検索でも、バックエンド側ならある程度時間がかかってもサーバのタイムアウト等の心配はない(ですよね...)。

PHPはかじる程度でしたので、今回の質問で色々勉強になりました。

補足日時:2008/12/11 09:55
    • good
    • 0

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


走らせればよいのでは?
    • good
    • 0

#3 あら、HTTP通信の話でしたか?


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

この回答への補足

>libcurlとか多言語を使うとか、並列で取得しにいくとか、
バックエンドで処理するということでしょうか?

>外部のクローラとかで先にDLしておくとか。
こちらの詳細を教えていただけますか?

補足日時:2008/12/10 13:42
    • good
    • 0

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;
 }
}
    • good
    • 0

ある単語を探す部分に、正規表現を使うと、


その分付加がかかります。可能なら
単純なSTR処理関数に置き換えれば、早くなるかも(保障無し)
<ベンチマークテストが必要>
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!