Package: php5 Version: 5.2.0-8+etch13 Severity: normal Tags: patch, upstream
php_curl_stream_read() in ext/curl/streams.c always calls select() after firing up a connection. however, when the php client is under heavy load, the server might have already responded, and the last call to curl_multi_perform() before entering the loop might have received all the data and closed the connection. at this point, curl_multi_fdset() in the loop returns maxfs == -1, and the following select turns into a pointless 15 sec sleep. I believe this problem is related to http://bugs.php.net/bug.php?id=23258 please see the attached patch. regards g.b. -- System Information: Debian Release: 4.0 APT prefers stable APT policy: (500, 'stable') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/dash Kernel: Linux 2.6.18-6-686 Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Versions of packages php5 depends on: ii libapache2-mod-php5 5.2.0-8+etch13 server-side, HTML-embedded scripti ii php5-common 5.2.0-8+etch13 Common files for packages built fr php5 recommends no packages. -- no debconf information
diff -Nur php-5.1.6.old/ext/curl/streams.c php-5.1.6/ext/curl/streams.c --- php-5.1.6.old/ext/curl/streams.c 2006-08-10 19:16:35.000000000 +0200 +++ php-5.1.6/ext/curl/streams.c 2009-02-04 17:16:39.000000000 +0100 @@ -160,7 +160,8 @@ tv.tv_sec = 15; /* TODO: allow this to be configured from the script */ /* wait for data */ - switch (select(curlstream->maxfd + 1, &curlstream->readfds, &curlstream->writefds, &curlstream->excfds, &tv)) { + switch ((curlstream->maxfd < 0) ? 1 : + select(curlstream->maxfd + 1, &curlstream->readfds, &curlstream->writefds, &curlstream->excfds, &tv)) { case -1: /* error */ return 0; @@ -173,7 +174,8 @@ curlstream->mcode = curl_multi_perform(curlstream->multi, &curlstream->pending); } while (curlstream->mcode == CURLM_CALL_MULTI_PERFORM); } - } while (curlstream->readbuffer.readpos >= curlstream->readbuffer.writepos && curlstream->pending > 0); + } while (curlstream->maxfd >= 0 && + curlstream->readbuffer.readpos >= curlstream->readbuffer.writepos && curlstream->pending > 0); }