1

changing a few options and deleting other resources can not I use the same multi handle:

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

i see:

a
b
b

a
b
b

i want to see:

a
b
b

a
c
c

in accroding with this f.a.q.

After a transfer, you just set new options in the handle and make another transfer. This will make libcurl to re-use the same connection if it can.

can help me?

thanks

1
  • a b b ...and after: a c c ... now i see: a b b a b b Commented Aug 31, 2011 at 17:05

1 Answer 1

2

you need to properly remove the channels from the multi-handle. The correct code in the middle should look like

// [...]
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;
// [...]

now you get your desired result of abbacc. As you might notice, we did not re-add $ch1, but still get a result back. This is due to the problem, that $ch1 is not in the multi-exec anymore, but is still a valid cURL-resource with the state "finished", and thus still has the same result as before - a. You can actually check this in the server logs, where the second call to $ch1 is not performed at all:

[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 "-" "-"
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.