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

Reply via email to