ID: 30525 User updated by: l dot cameron2 at ugrad dot unimelb dot edu dot au Reported By: l dot cameron2 at ugrad dot unimelb dot edu dot au -Status: No Feedback +Status: Open Bug Type: MySQL related -Operating System: Fedora Core 2 +Operating System: win32 -PHP Version: 5.0.2 +PHP Version: 5.0.x and 4.x New Comment:
Changing status back to open; The bug still exists in 5.0CVS as of 2005-04-27 (The sample code I gave still fails). Note kevin at hatry dot com's comments that it also exists in 4.x Previous Comments: ------------------------------------------------------------------------ [2005-04-26 18:00:49] kevin at hatry dot com this bug also exists with php 4.3.11 on both win32 (mysql client 3.23.49) and linux (mysql client 4.1.9). Reproduce code: <?php $link1 = mysql_connect('localhost','root','',false); mysql_select_db('mysql',$link1); $link2 = mysql_connect('localhost','root','',false); mysql_select_db('mysql',$link2); echo "link1:"; var_dump($link1); echo "link2:"; var_dump($link2); // both links usable with mysql_query for example mysql_close($link2); // LINE 13 : $link2 = -1; echo "link1:"; var_dump($link1); echo "link2:"; var_dump($link2); ?> this outputs : link1:resource(4) of type (mysql link) link2:resource(4) of type (mysql link) link1:resource(4) of type (mysql link) link2:resource(4) of type (mysql link) and both links are usable for mysql_query even after the mysql_close on one of them. Is is a feature or a bug ? (would be ok as a feature i think) If you uncomment line 13 ($link2 = -1;) we have : link1:resource(4) of type (mysql link) link2:resource(4) of type (mysql link) link1:resource(4) of type (Unknown) link2:int(-1) $link1 is no longer a mysql link resource even though we only closed $link2 ! In fact if you comment the mysql_close but keep the line 13 uncommented, the output is : link1:resource(4) of type (mysql link) link2:resource(4) of type (mysql link) link1:resource(4) of type (mysql link) link2:int(-1) and there $link1 is usable. So it seems that affecting a value (-1, NULL or 'unset'ing) to a mysql resource do an implicit mysql_close but if that resource was already closed we have the equivalent of 2 calls to mysql_close and that is the bug. ------------------------------------------------------------------------ [2005-03-15 01:00:23] php-bugs at lists dot php dot net No feedback was provided for this bug for over a week, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open". ------------------------------------------------------------------------ [2005-03-07 22:31:13] [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 ..and update the version field if this still happens, otherwise close this report. ------------------------------------------------------------------------ [2004-10-22 06:19:48] l dot cameron2 at ugrad dot unimelb dot edu dot au Description: ------------ Preface: I *do* understand that by default MySQL connections are shared in PHP. I also note that in older versions a single mysql_close() would close all of the links; see #9107: there now there appears to be reference counting before finally closing the TCP connection -- which is IMHO better than the older behaviour, but the implementation has its own bugs: PHP appears to keeps an internal count of the number of times a link has been duplicated. When the link count is <= 0, the underlying TCP connection is actually closed. * close() reduces the link count by 1 * setting the connection to null *also* reduces the link count by 1 -- even if that link has already been close()d Currently the only workarounds for this are to: [1] Set new_link to true every time you mysql_connect() -- potentially creating a lot of TCP connections and slowing the program down [2] close() the link, but never set it to null and hope that PHP won't clean it up until the end of the program: This *will* fail sometimes though; see the example at http://www.levi.id.au/mysql4.php.txt [3] Never mysql_close() links, only set them to null and hope that PHP will in fact clean up the TCP connection before MySQL runs out of available connections (admittedly only a problem when you have a lot of simultaneous connections to your database) -- this does work now, but we're not supposed to assume anything about when PHP does its object destruction. The third is really the only viable solution; but is dependent on the internal implementation of the MySQL extension. At best, the current situation is that if you ever have shared links, you should never call mysql_close if you ever expect to use that database again in your program. Reproduce code: --------------- Simple example: #!/usr/local/bin/php -q <? $conn1 = mysql_connect('localhost:3306', 'levi', 'DaCr0n!'); $conn2 = mysql_connect('localhost:3306', 'levi', 'DaCr0n!'); mysql_select_db('surveytest', $conn1); mysql_select_db('surveytest', $conn2); mysql_close($conn1); $conn1 = null; mysql_close($conn2); $conn2 = null; ?> See also the example at http://www.levi.id.au/mysql4.php.txt Expected result: ---------------- Blank output. Actual result: -------------- PHP Warning: mysql_close(): 1 is not a valid MySQL-Link resource in /home/levi/public_html/mysql2.php on line 10 <br /> <b>Warning</b>: mysql_close(): 1 is not a valid MySQL-Link resource in <b>/home/levi/public_html/mysql2.php</b> on line <b>10</b><br /> (If I remove the mysql_close($conn1); it works) (If I remove the $conn1 = null; it also works) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=30525&edit=1