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 this is not your bug, you can add a comment by following this link.
If this is your bug, but 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

Add a Patch

Pull Requests

Add a Pull Request

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: Wed Apr 24 17:01:30 2024 UTC