11

私は cURL を使用して、データベースに保存されている 20,000 を超えるドメイン名のランク データを取得しています。

私が使用しているコードはhttp://semlabs.co.uk/journal/object-directional-curl-class-with-multi-threadingです。

配列 $competeRequests は、ウェブサイト ランク用の compet.com API への 20,000 リクエストです。

これはリクエストの例です: http://apps.compete.com/sites/stackoverflow.com/trended/rank/?apikey=xxxx&start_date=201207&end_date=201208&jsonp= ";

これらのリクエストは 20,000 あるので、それらをチャンクに分割したいので、次のコードを使用してそれを実現しています。

foreach(array_chunk($competeRequests, 1000) as $requests) {
    foreach($requests as $request) {
        $curl->addSession( $request, $opts );
    }

}

これは、1,000 のバッチでリクエストを送信するのに最適ですが、スクリプトの実行に時間がかかりすぎます。max_execution_time を 10 分以上に増やしました。

配列から 1,000 件のリクエストを送信し、結果を解析してステータスの更新を出力し、配列が空になるまで次の 1,000 件を続行する方法はありますか? 現時点では、スクリプトが実行されている間ずっと画面が白いままで、10 分以上かかることがあります。

4

4 に答える 4

8

これは常に私のために仕事をします... https://github.com/petewarden/ParallelCurl

于 2012-10-03T18:44:59.563 に答える
5

https://github.com/krakjoe/pthreads

ここに画像の説明を入力

PHP でスレッド化することもできますが、描かれているコードは恐ろしいスレッド プログラミングです。その方法をお勧めしませんが、20,000 スレッドのオーバーヘッドを示したいと思います。私の現在のハードウェアでは 18 秒です。サーバーハードウェアでは、8ギガのRAMを搭載したIntel G620(デュアルコア)であり、はるかに高速な結果が期待できます...そのようなタスクをどのようにスレッド化するかは、リソースと、要求しているサービスのリソースに依存します...

于 2012-09-13T18:55:56.787 に答える
2

これを php スクリプトの先頭に置きます。

set_time_limit(0);
@apache_setenv('no-gzip', 1);//comment this out if you use nginx instead of apache
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);

これにより、Web サーバーまたは php が実行している可能性のあるすべてのキャッシュが無効になり、スクリプトの実行中に出力がブラウザーに表示されます。

apache_setenvapache の代わりに nginx Web サーバーを使用する場合は、行をコメントアウトするように注意してください。

nginx の更新:

そのため、OPはnginxを使用しています.nginxはPHPからのgzip圧縮を無効にできないため、少し面倒です。私もnginxを使用していますが、デフォルトでアクティブになっていることがわかりました。以下を参照してください。

cat /etc/nginx/nginx.conf | grep gzip
    gzip on;
    gzip_disable "msie6";
    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

そのため、nginx.conf で gzip を無効にして、nginx を再起動する必要があります。

/etc/init.d/nginx restart

または、gzip_disableまたはgzip_typesオプションを使用して、一部のブラウザーまたは一部のページ コンテンツ タイプの gzip をそれぞれ条件付きで無効にすることができます。

于 2012-09-12T18:27:48.317 に答える