From:             karldray at interchange dot ubc dot ca
Operating system: Windows XP
PHP version:      5.2.1
PHP Bug Type:     Sockets related
Bug description:  Blocking socket functions cause Apache freeze

Description:
------------
I have a PHP page that opens a UDP socket and listens for data (blocking
on socket_recvfrom). When the socket recieves a packet, the script echoes
a message and finishes. This works fine, but when two instances of this
page are running (both blocking on socket_recvfrom), Apache (2.2.4) stops
responding to any new requests (even for non-php pages) until one of them
gets unblocked. The same problem occurs with other blocking socket
functions (such as socket_accept and socket_read with TCP sockets).

Reproduction instructions:
1. open a browser window to udp_recv.php?port=11111. it sits there
"loading" since PHP is waiting for socket data.
2. open another browser window to udp_recv.php?port=22222.
3 (the problem). open another browser window and point it to index.html or
any other url on the server. it just sits there "loading".
4. in a command prompt, type "perl udp_send.pl 11111" to send 'hello' to
the first php script's udp socket, causing it to finish. Suddenly, the
third request completes.

Reproduce code:
---------------
udp_recv.php:

<?php
$listener = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($listener, gethostbyname('localhost'), $_GET['port']) or
exit('error on bind');
$len = socket_recvfrom($listener, $data, 2048, 0, $host, $port);
echo "$len bytes recieved from $host:$port: $data\n";
?>

udp_send.pl:

use strict; use Socket;
socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('udp')) or die "socket:
$!";
send(SOCKET, 'hello', 0, sockaddr_in(shift, inet_aton('localhost'))) or
die "send: $!";


Expected result:
----------------
I expect Apache to continue to accept and handle new web page requests
while the two PHP pages are blocking on socket functions.

Actual result:
--------------
Once there are two PHP pages blocking on socket functions, all subsequent
requests (even for non-php URIs) appear as "loading" in the browser until
one of the PHP scripts unblocks.

Note: If the third request is for a PHP page containing an error_log() at
the very beginning, then the logfile output is not generated as long as
the first two pages are blocking (suggesting that Apache isn't getting
around to starting PHP during this time).

-- 
Edit bug report at http://bugs.php.net/?id=40594&edit=1
-- 
Try a CVS snapshot (PHP 4.4): 
http://bugs.php.net/fix.php?id=40594&r=trysnapshot44
Try a CVS snapshot (PHP 5.2): 
http://bugs.php.net/fix.php?id=40594&r=trysnapshot52
Try a CVS snapshot (PHP 6.0): 
http://bugs.php.net/fix.php?id=40594&r=trysnapshot60
Fixed in CVS:                 http://bugs.php.net/fix.php?id=40594&r=fixedcvs
Fixed in release:             
http://bugs.php.net/fix.php?id=40594&r=alreadyfixed
Need backtrace:               http://bugs.php.net/fix.php?id=40594&r=needtrace
Need Reproduce Script:        http://bugs.php.net/fix.php?id=40594&r=needscript
Try newer version:            http://bugs.php.net/fix.php?id=40594&r=oldversion
Not developer issue:          http://bugs.php.net/fix.php?id=40594&r=support
Expected behavior:            http://bugs.php.net/fix.php?id=40594&r=notwrong
Not enough info:              
http://bugs.php.net/fix.php?id=40594&r=notenoughinfo
Submitted twice:              
http://bugs.php.net/fix.php?id=40594&r=submittedtwice
register_globals:             http://bugs.php.net/fix.php?id=40594&r=globals
PHP 3 support discontinued:   http://bugs.php.net/fix.php?id=40594&r=php3
Daylight Savings:             http://bugs.php.net/fix.php?id=40594&r=dst
IIS Stability:                http://bugs.php.net/fix.php?id=40594&r=isapi
Install GNU Sed:              http://bugs.php.net/fix.php?id=40594&r=gnused
Floating point limitations:   http://bugs.php.net/fix.php?id=40594&r=float
No Zend Extensions:           http://bugs.php.net/fix.php?id=40594&r=nozend
MySQL Configuration Error:    http://bugs.php.net/fix.php?id=40594&r=mysqlcfg

Reply via email to