Edit report at https://bugs.php.net/bug.php?id=63411&edit=1

 ID:                 63411
 Updated by:         [email protected]
 Reported by:        marcel at silverstreet dot com
 Summary:            curl_multi_select() returns invalid value
 Status:             Feedback
 Type:               Bug
 Package:            cURL related
 Operating System:   CentOS 6.3
 PHP Version:        5.3.18
 Assigned To:        pierrick
 Block user comment: N
 Private report:     N

 New Comment:

As mentioned in bug #61141, curl_multi_select() returning -1 is an expected 
behaviour and you should not throw an exception which prevent your call to 
be done.

Internally php curl_multi_select uses libcurl curl_multi_fdset function to set 
all the fd_set and the maxfd value. The libcurl curl_multi_fdset 
documentation says :

When libcurl returns -1 in max_fd, it is because libcurl currently does 
something that isn't possible for your application to monitor with a socket and 
unfortunately you can then not know exactly when the current action is 
completed using select(). When max_fd returns with -1, you need to wait a while 
and then proceed and call curl_multi_perform anyway. How long to wait? I would 
suggest 100 milliseconds at least, but you may want to test it out in 
our own particular conditions to find a suitable value.

The workaround you made is not really a workaround, but is exactly what libcurl 
recommend you to do in this case :)


Previous Comments:
------------------------------------------------------------------------
[2012-11-15 11:42:21] bfanger at gmail dot com

curl_multi_select() returning -1 has been an issue for windows versions of PHP 
for a while:
https://bugs.php.net/bug.php?id=61141

A workaround for my Curl wrapper class was to rewrite:

if (curl_multi_select(self::$pool, 0.2) === -1) {
   throw new \Exception('Failed to detect changes in the cURL multi handle');
}

To:

if (curl_multi_select(self::$pool, 0.2) === -1) {
   usleep(100000); // wait 0.1 second
}


PS:
When are you going to introduce the new curl_multi_wait function to php?

------------------------------------------------------------------------
[2012-11-15 09:30:31] bfanger at gmail dot com

It breaks all my testcases in PHP 5.4.8 (works fine in 5.4.7)

$ git clone git://github.com/sledgehammer/core.git testapp/core
$ phpunit --bootstrap testapp/core/phpunit_bootstrap.php 
testapp/core/tests/CurlTest.php

------------------------------------------------------------------------
[2012-11-15 05:39:33] [email protected]

Does it break all the test cases ? Or only like in your case when you have no 
handle ?

------------------------------------------------------------------------
[2012-11-05 15:21:29] aa dot vasilenko at gmail dot com

This bug breaks existing libs, like Buzz https://github.com/kriswallsmith/Buzz 
, 
that relies on curl_multi_* functions. This is how I came here.

------------------------------------------------------------------------
[2012-11-03 03:42:09] [email protected]

I'm not sure we really want to wait 1 second for nothing in this specific case.

Furthermore, as mentioned in my commit message, when libcurl returns -1 in 
max_fd after calling curl_multi_fdset, it is because libcurl currently
does something that isn't possible for your application to monitor
with a socket and unfortunately you can then not know exactly when
the current action is completed using select().

I would personally keep the current behaviour.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=63411


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=63411&edit=1

Reply via email to