Bug #63411 [Fbk]: curl_multi_select() returns invalid value
| From: | pierrick@php.net | Date: | Thu, 15 Nov 2012 13:54:10 +0000 |
| Subject: | Bug #63411 [Fbk]: curl_multi_select() returns invalid value | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-174718@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=63411&edit=1
ID: 63411
Updated by: pierrick@php.net
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] pierrick@php.net
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] pierrick@php.net
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