4

さて、私は最初のプロセスで生成したハンドルを再利用しようとしていますが、最初の実行後は単に機能しなくなります。ハンドルを削除(またはハンドラー全体を再作成)して再度追加すると、正常に機能します。これの原因は何でしょうか?

私のコードは現在次のようになっています:

<?php
echo 'Handler amount: ';
$threads = (int) trim(fgets(STDIN));
if($threads < 1) {
    $threads = 1;
}

$s = microtime(true);
$url = 'http://mywebsite.com/some-script.php';

$mh = curl_multi_init();
$ch = array();
for($i = 0; $i < $threads; $i++) {
    $ch[$i] = curl_init($url);
    curl_setopt_array($ch[$i], array(
        CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20130213 Firefox/21.0',
        CURLOPT_REFERER => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_NOBODY => true
    ));

    curl_multi_add_handle($mh, $ch[$i]);
}

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

    $e = microtime(true);
    $totalTime = number_format($e - $s, 2);
    if($totalTime >= 1) {
        echo floor($threads / $totalTime) . ' requests per second (total time '.$totalTime.'s)' . "\r";
        $s = microtime(true);
    }
}

foreach($ch as $handler) {
    curl_multi_remove_handle($mh, $handler);
    curl_close($handler);
}

curl_multi_close($mh);
?>

CURLOPT_VERBOSE設定するとtrue、「転送がうまくいかない追加のメッセージが表示されます。c:1037:0 0」のメッセージが表示されます。別の質問でそれらについて読んだところ、いくつかの明らかな原因が原因のようです。

  • 早過ぎる

  • ファイアウォール

  • ISP制限

AFAIK、これはそうではありません。毎回ハンドルを再作成すると、1秒あたり約79リクエスト(それぞれ約529バイト)で正常に完了するためです。

ハンドルを再利用するための私のプロセス:

  1. マルチハンドラーを作成し、指定した数のハンドルをマルチハンドラーに追加します

  2. mutliハンドラーが機能している間に、すべてのハンドルを実行します

  3. whileループが停止した後(停止する可能性は非常に低いようです)、すべてのハンドルとマルチカールハンドラーを閉じます

すべてのハンドルを一度実行してから停止します。

これは本当に私を困惑させています。何か案は?

4

1 に答える 1