#27007 [Bgs->Opn]: Failed pg_connect leaves Network Socket in CLOSE_WAIT State

From: Date: Wed, 28 Jan 2004 13:35:20 +0000
Subject: #27007 [Bgs->Opn]: Failed pg_connect leaves Network Socket in CLOSE_WAIT State
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-54040@lists.php.net to get a copy of this message
ID: 27007 User updated by: bty at requesttech dot com Reported By: bty at requesttech dot com -Status: Bogus +Status: Open Bug Type: PostgreSQL related Operating System: RedHat 9 PHP Version: 4.3.4 New Comment: The code is only an example of what will cause the problem. The fact that it is "insane" to do this does not eleminate the problem. Picture hundreds of people failling to login to a high traffic web site. I will have to HUP the server every couple of hours to fix PHPs problem. Did you even bother to try the code? I have tcpdumps proving that PHP is doing the WRONG thing. Previous Comments: ------------------------------------------------------------------------ [2004-01-23 01:43:05] sniper@php.net This is by design, actual closing of connections happens during request shutdown. Doing such for loop is pretty insane anyway, don't you think? :) ------------------------------------------------------------------------ [2004-01-22 12:16:20] bty at requesttech dot com Description: ------------ When a database connection to postgres fails the assocaited socket is not closed by PHP but kept in a CLOSE_WAIT state. When doing a tcpdump if the PostgreSQL sends a FIN first the final FIN packet is not Sent by PHP leaving the socket in CLOSE_WAIT. I have checked bug reports 9252 and 16356. This IS PHPs problem as it does not correctly send the FIN packet (probably a if( GOT_FIN ) close( socket ) missing from the code) when the PostgreSQL server (or any service) sends FIN first. This is a serious issue as the only way to remove the CLOSE_WAIT sockets is to restart the web server. It is obvious that PHP is not doing something correct. Reproduce code: --------------- $resource_id = pg_connect( "host=good dbname=good user=good password=good" ); pg_close( $resource_id ); //This will put the socket in a TIME_WAIT state and will //close in a matter of minutes for( $i=0; $i < 1024; $i++ ) { $resource_id = pg_connect( "host=good dbname=good user=good password=bad" ); if( $resource_id ) pg_close( $resource_id ); } //Towards the end of this loop, connections will be refused //because too many sockets are open. //The sockets remain in the CLOSE_WAIT state until the web //server is rebooted Expected result: ---------------- Sockets are closed by the final sending of a FIN packet from PHP. Actual result: -------------- Sockets are left in CLOSE_WAIT until the web server is rebooted. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=27007&edit=1

« previous php.bugs (#54040) next »