4

以下のコードを実行すると、それは私には思え、curl_multi_select互いにcurl_multi_info_read矛盾しています。私が理解しているように、それcurl_multi_selectは応答があるまでブロックすることになってcurl_multi_execいますが、実際にそれが起こるのを見たことがありません。

$url = "http://google.com";
$ch  = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);

$mc = curl_multi_init();
curl_multi_add_handle($mc, $ch);

do {
  $exec = curl_multi_exec($mc, $running);
} while ($exec == CURLM_CALL_MULTI_PERFORM);

$ready=curl_multi_select($mc, 100);
var_dump($ready);

$info = curl_multi_info_read($mc,$msgs);
var_dump($info);

これは戻ります

int 1
boolean false

それ自体と矛盾しているようです。どうすれば準備ができてメッセージが表示されないのでしょうか。

私が使用しているphpのバージョンは5.3.9です

4

2 に答える 2

5

基本的curl_multi_selectに、読み取りまたは送信するものができるまでブロックしcurl_multi_execます。curl_multi_execこれを使用せずにループするcurl_multi_selectと、CPUコアが100%消費されます。したがってcurl_multi_info_read、転送が(正しくまたはエラーで)終了したかどうかを確認するために使用されます。

マルチハンドルを使用するコードは、次のパターンに従う必要があります。

do
{
    $mrc = curl_multi_exec($this->mh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK)
{
    curl_multi_select($this->mh);
    do
    {
        $mrc = curl_multi_exec($this->mh, $active);
    }
    while ($mrc == CURLM_CALL_MULTI_PERFORM);
    while ($info = curl_multi_info_read($this->mh))
    {
        $this->process_ch($info);
    }
}

参照:curl_multi_execを正しい方法で実行する

于 2012-05-05T18:27:06.290 に答える
0

スペックから:

個々の転送からのメッセージや情報があるかどうかマルチハンドルに尋ねます。メッセージには、転送からのエラーコードや、転送が完了したという事実などの情報が含まれる場合があります。

1は、アクティビティがあることを意味する場合がありますが、必ずしもメッセージが待機しているとは限りません。この場合、ダウンロードデータの一部が利用可能である可能性がありますが、すべてではありません。curl_multi_selectドキュメントの例では、から戻ったfalse値を明示的にテストしていますcurl_multi_info_read

于 2012-04-13T22:26:57.557 に答える