5

解決策を求めてstackoverflowを検索していましたが、私が達成しようとしているものに近いものを見つけることができませんでした。おそらく私は、誰もがこの問題に取り組んでいる魔法のPHPソースに幸いにも気づいていません...;)

基本的に、リモートサーバー上のさまざまなXMLファイルを指す数百のURLを指定または取得する配列があります。XMLファイルの内容が変更されているかどうかを確認するために、魔法のファイルチェックを行っています。変更されている場合は、新しいXMLをサーバーにダウンロードします。

PHPコード:

$urls = array(
    'http://stackoverflow.com/a-really-nice-file.xml',
    'http://stackoverflow.com/another-cool-file2.xml'
);
foreach($urls as $url){
    set_time_limit(0);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, false);
    $contents = curl_exec($ch);
    curl_close($ch);
    file_put_contents($filename, $contents);
}

これで、$ filenameが別の場所に設定され、ロジックに基づいて各xmlに独自のIDが与えられます。これまでのところ、このスクリプトは正常に実行されており、本来の動作を実行しますが、実行速度は非常に遅くなります。私のサーバーはもっと多くのことを処理できることを知っており、私のforeachがプロセスを遅くしているのではないかと思います。

foreachを高速化する方法はありますか?現在、各foreachループのfile_put_contentsを10または20に増やすことを考えていますが、基本的に実行時間を10倍または20倍に短縮しますが、これを最善かつ最もパフォーマンスの高い方法で行う方法を考えることはできません。続行する方法に関するヘルプやポインタはありますか?

4

3 に答える 3

6

ボトルネック(ほとんどの場合)はcurlリクエストです。ファイルに書き込むことができるのは、各リクエストが実行された後のみです。(単一のスクリプトで)そのプロセスを高速化する方法はありません。

すべてがどのように機能するかはわかりませんが、curlリクエストを並行して実行できます:http://php.net/manual/en/function.curl-multi-exec.php

たぶん、データをフェッチして(メモリがデータを保存できる場合)、データが完成したらデータを入力することができます。

于 2012-10-05T23:38:38.853 に答える
2

さらにスクリプトを実行するだけです。各スクリプトはいくつかのURLをダウンロードします。

このパターンの詳細については、http://en.wikipedia.org/wiki/Thread_pool_patternを参照してください。

実行するスクリプトが多いほど、並列処理が増えます

于 2012-10-05T23:07:57.563 に答える
0

私は並列リクエストでガズルプールを使用します;)(x並列リクエストを送信できます)

http://docs.guzzlephp.org/en/stable/quickstart.html

于 2017-12-15T11:35:27.747 に答える