1

いくつかのオプションを変更して他のリソースを削除すると、同じマルチハンドルを使用できません。

    $ ch1 = curl_init();
    $ ch2 = curl_init();
    $ ch3 = curl_init();

    curl_setopt($ ch1、CURLOPT_URL、 "http://mytestsite.com/test.curl.php?test=a");
    curl_setopt($ ch1、CURLOPT_HEADER、0);
    curl_setopt($ ch1、CURLOPT_RETURNTRANSFER、TRUE);

    curl_setopt($ ch2、CURLOPT_URL、 "http://mytestsite.com/test.curl.php?test=b");
    curl_setopt($ ch2、CURLOPT_HEADER、0);
    curl_setopt($ ch2、CURLOPT_RETURNTRANSFER、TRUE);

    curl_setopt($ ch3、CURLOPT_URL、 "http://mytestsite.com/test.curl.php?test=b");
    curl_setopt($ ch3、CURLOPT_HEADER、0);
    curl_setopt($ ch3、CURLOPT_RETURNTRANSFER、TRUE);

    $ mh = curl_multi_init();

    curl_multi_add_handle($ mh、$ ch1);
    curl_multi_add_handle($ mh、$ ch2);
    curl_multi_add_handle($ mh、$ ch3);

    $ active = null;

    行う
    {{
        $ mrc = curl_multi_exec($ mh、$ active);
    }
    while($ mrc == CURLM_CALL_MULTI_PERFORM);

    while($ active && $ mrc == CURLM_OK)
    {{
        if(curl_multi_select($ mh)!= -1)
        {{
            行う
            {{
                $ mrc = curl_multi_exec($ mh、$ active);
            }
            while($ mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }  

    $ test1 = curl_multi_getcontent($ ch1);
    $ test2 = curl_multi_getcontent($ ch2);
    $ test3 = curl_multi_getcontent($ ch3);
    error_log($ test1); //
    error_log($ test2); // b
    error_log($ test3); // b

    curl_multi_remove_handle($ mh、$ ch1);
    // curl_multi_remove_handle($ mh、$ ch2);
    // curl_multi_remove_handle($ mh、$ ch3);
    curl_setopt($ ch2、CURLOPT_URL、 "http://mytestsite.com/test.curl.php?test=c");
    curl_setopt($ ch3、CURLOPT_URL、 "http://mytestsite.com/test.curl.php?test=c");

    $ active = null;

    行う
    {{
        $ mrc = curl_multi_exec($ mh、$ active);
    }
    while($ mrc == CURLM_CALL_MULTI_PERFORM);

    while($ active && $ mrc == CURLM_OK)
    {{
        if(curl_multi_select($ mh)!= -1)
        {{
            行う
            {{
                $ mrc = curl_multi_exec($ mh、$ active);
            }
            while($ mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }

    $ test1 = curl_multi_getcontent($ ch1);
    $ test2 = curl_multi_getcontent($ ch2);
    $ test3 = curl_multi_getcontent($ ch3);
    error_log($ test1); //
    error_log($ test2); // b
    error_log($ test3); // b

    curl_multi_close($ mh);

そうですか:

a
b
b

a
b
b

見たい:

a
b
b

a
c
c

このFAQに同意する

転送後、ハンドルに新しいオプションを設定して、別の転送を行うだけです。これにより、可能であればlibcurlが同じ接続を再利用できるようになります。

私を助けることができますか?

ありがとう

4

1 に答える 1

1

マルチハンドルからチャネルを適切に削除する必要があります。真ん中の正しいコードは次のようになります

// [...]
echo curl_multi_getcontent( $ch1 );
echo curl_multi_getcontent( $ch2 );
echo curl_multi_getcontent( $ch3 );

// Removing the channels 
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_remove_handle($mh, $ch3);

// and of course we need to re-add them
curl_setopt($ch2, CURLOPT_URL, "http://example.com/test.curl.php?test=c");
curl_setopt($ch3, CURLOPT_URL, "http://example.com/test.curl.php?test=c");
curl_multi_add_handle($mh,$ch2);
curl_multi_add_handle($mh,$ch3);

$active = null;
// [...]

これで、希望する結果が得られますabbacc。お気づきかもしれませんが、再追加はしていません$ch1が、結果が返されます。これは、multi-execには存在しないという問題が原因$ch1ですが、状態が「finished」の有効なcURLリソースであるため、以前と同じ結果になります- a。これはサーバーログで実際に確認できますが、2回目の呼び出し$ch1はまったく実行されていません。

[31/Aug/2011:23:42:06 +0200] "GET /test.php?test=a HTTP/1.1" 200 1 "-" "-"
[31/Aug/2011:23:42:06 +0200] "GET /test.php?test=b HTTP/1.1" 200 1 "-" "-"
[31/Aug/2011:23:42:06 +0200] "GET /test.php?test=b HTTP/1.1" 200 1 "-" "-"
[31/Aug/2011:23:42:06 +0200] "GET /test.php?test=c HTTP/1.1" 200 1 "-" "-"
[31/Aug/2011:23:42:06 +0200] "GET /test.php?test=c HTTP/1.1" 200 1 "-" "-"
于 2011-08-31T21:45:29.127 に答える