ID: 29560 User updated by: info at tphnet dot com Reported By: info at tphnet dot com -Status: Feedback +Status: Open Bug Type: Sockets related Operating System: Windows XP SP1 PHP Version: 5.0.0 New Comment:
I changed to code to the following: <?php $socket = stream_socket_server('tcp://localhost:1234', $errno, $errstr); stream_set_blocking($socket, 0); while(true){ $new_connection = @stream_socket_accept($socket, 0); unset($new_connection);} ?> There is no memory leak anymore and everything is working as expected. It appears the problem is solved. Previous Comments: ------------------------------------------------------------------------ [2004-08-07 15:07:44] [EMAIL PROTECTED] Urgh, ignore that (clicked wrong link). The sockets extension is unmaintained. Try stream_socket_create() and fiends instead. ------------------------------------------------------------------------ [2004-08-07 14:50:11] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php5-latest.tar.gz For Windows: http://snaps.php.net/win32/php5-win32-latest.zip ------------------------------------------------------------------------ [2004-08-07 03:01:35] info at tphnet dot com Description: ------------ I've been trying to write a simple multi-client server application in PHP. Everything is working just fine, the only problem is that the server is leaking memory. Reproduce code: --------------- $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($socket, 'localhost', 1234); socket_listen($socket); socket_set_nonblock($socket); while(true){ $new_connection = @socket_accept($socket); unset($new_connection); } Expected result: ---------------- The above server will accept connections on localhot:1234 and will disconnect you directly after you connect. The socket is setup in non-blocking mode, so that with a couple of minor modifications it becomes possible to handle multiple clients at the same time. Actual result: -------------- The code does exactly what it is supposed to do, but its memory use increases very fast. It fills up my 512 megs in about a minute. The memory leak occours in the socket_accept() function. Removing this line will stop the memory leak from occouring. If you remove the socket_set_nonblock() function it also does not leak memory anymore. This seems kind of logical because the script will "hang" on the socket_accept() function instead of looping over it constantly. In the version of the script I'm actually using, a "usleep(100000)" has been added in the while loop to make sure the script doesn't consume all available resources, but the memory leak still remains. Although it takes much longer to fill all memory because socket_accept() is called less frequent. Removing the "@" sign infront of the socket_accept() function causes the following two errors to be printed on the console for every call to socket_accpet(): Warning: socket_accept(): unable to accept incoming connection [0]: Een niet-blokkerende socketbewerking kan niet onmiddellijk worden voltooid. Warning: socket_accept(): unable to accept socket connection [0]: De bewerking is voltooid. The first error roughly translates to "A non-blocking socket action cannot be executed immediately" and the second to "The action has been completed". I'm not really an expert on sockets so I'm not sure if my script is just flawed or this is a real bug. I've used the above code in a somewhat more advanced form to create a small POP3 server. This server is functioning just fine, the only problem is that it is leaking memory. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=29560&edit=1