PHP cURL мульти дескриптор изменения опций - PullRequest
1 голос
/ 31 августа 2011

изменив несколько параметров и удалив другие ресурсы, я не могу использовать тот же мульти дескриптор:


    $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;

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

    while ($active && $mrc == CURLM_OK) 
    {
        if (curl_multi_select($mh) != -1) 
        {
            do 
            {
                $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);  // a
    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;

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

    while ($active && $mrc == CURLM_OK) 
    {
        if (curl_multi_select($mh) != -1) 
        {
            do 
            {
                $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);  // a
    error_log($test2);  // b
    error_log($test3);  // b 

    curl_multi_close($mh);

я вижу:

a
b
b

a
b
b

я хочу увидеть:

a
b
b

a
c
c

в соответствии с этой формой.

После передачи вы просто устанавливаете новые параметры в дескрипторе и делаете еще один перевод. Это заставит libcurl повторно использовать то же соединение, если это возможно.

может мне помочь?

спасибо

1 Ответ

1 голос
/ 01 сентября 2011

вам нужно правильно удалить каналы из мульти-ручки. Правильный код в середине должен выглядеть как

// [...]
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, но все же получили результат обратно. Это связано с тем, что $ch1 больше не входит в multi-exec, но все еще является действительным ресурсом cURL с состоянием «закончено» и, следовательно, имеет тот же результат, что и раньше - a. Вы можете проверить это в журналах сервера, где второй вызов $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 "-" "-"
...