php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #30526 mysql_close() fails in some situations with shared links
Submitted: 2004-10-22 06:20 UTC Modified: 2004-10-22 06:33 UTC
From: l dot cameron2 at ugrad dot unimelb dot edu dot au Assigned:
Status: Not a bug Package: MySQL related
PHP Version: 5.0.2 OS: Fedora Core 2
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: l dot cameron2 at ugrad dot unimelb dot edu dot au
New email:
PHP Version: OS:

 

 [2004-10-22 06:20 UTC] 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)

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2004-10-22 06:28 UTC] l dot cameron2 at ugrad dot unimelb dot edu dot au
Accidentally submitted twice; deleting this one.
See #30525 for the real bug
 [2004-10-22 06:33 UTC] l dot cameron2 at ugrad dot unimelb dot edu dot au
Actually the status should be bogus so people dont think this bug means anything -- see #30525 for the real bug
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Dec 27 01:01:28 2024 UTC