6

標準の cURL_multi_exec 関数 (以下の例) を実行すると、要求されたすべての cURL ハンドルが一度に取得されます。各リクエスト間に 100 ミリ秒の遅延を入れたいのですが、それを行う方法はありますか? (Google および StackOverflow 検索で何も見つかりませんでした)

curl_multi_exec() の前に usleep() を試しました。これにより、スクリプトの速度が低下しますが、各リクエストは延期されません。

// array of curl handles & results
$curlies = array();
$result = array();
$mh = curl_multi_init();

// setup curl requests
for ($id = 0; $id <= 10; $id += 1) {
    $curlies[$id] = curl_init();
    curl_setopt($curlies[$id], CURLOPT_URL,            "http://google.com");
    curl_setopt($curlies[$id], CURLOPT_HEADER,         0);
    curl_setopt($curlies[$id], CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $curlies[$id]);
}

// execute the handles
$running = null;
do {
    curl_multi_exec($mh, $running);
} while($running > 0);

// get content and remove handles
foreach($curlies as $id => $c) {
    $result[$id] = curl_multi_getcontent($c);
    curl_multi_remove_handle($mh, $c);
}

// all done
curl_multi_close($mh);

私はこれに一日中取り組んでいます。どんな助けでも大歓迎です! ありがとうございました。

編集: cUrl 以外の方法はありますか? それは私の質問にも答えます。

4

4 に答える 4

4

はい、可能です。ParallelCurl ライブラリを使用するusleep()と、ダウンロード キューに別のリクエストを追加できるため、100 ミリ秒の遅延をより簡単に追加できます。

for ($urls as $url) {
    $pcurl->startRequest($url);
    usleep(100000);
}
于 2011-08-08T19:38:06.823 に答える
3

できるとは思わないでください。これを cli から実行すると、代わりにスクリプトを 10 個のプロセスにフォークし、それぞれから通常の curl リクエストを発行できます。これにより、タイミングを細かく制御できます。

于 2011-08-08T19:27:41.467 に答える
1

PHPはそのためのソリューションではありません。スクリプトをフォークしても役に立ちません。最初はそうですが、もう少し多くのWebサイトを取得したら、そのように取得する必要があります。自分がサーバーとして非常に赤くなります。コストとスクリプトの安定性の観点から、他のアイデアを使用することを再検討する必要があります。

これはPythonで簡単に行うことができ、APIエンドポイントへの非ブロッキングリアルタイム呼び出しの場合は、Socket.IO+Node.JSまたはNode.JSなどを使用する必要があります。

時間がない場合や、次のようなものを使用することはできません。

http://framework.zend.com/manual/en/zendx.console.process.unix.overview.html

それは実際にはあなたが何を達成しようとしているのかに依存します。

于 2011-08-10T04:42:28.770 に答える
0

これを試すことができます:
タイムスタンプを DB に保存し、ハンドルを 1 つ追加して を呼び出しますcurl_multi_exec。タイミングを確認し、必要に応じてハンドルを追加するために
使用します。ここでDaniel Stenberg (cURL と libcurl の作成者) は、 の実行後にさらにハンドルを追加できると述べています。CURLOPT_PROGRESSFUNCTION
curl_multi_exec

于 2013-06-19T20:41:37.247 に答える