#30525 [Bgs-Opn]: mysql_close() fails in some situations with shared links

2005-04-28 Thread l dot cameron2 at ugrad dot unimelb dot edu dot au
 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:   Bogus
+Status:   Open
 Bug Type: MySQL related
-Operating System: win32
+Operating System: *
 PHP Version:  5.0.x and 4.x
 New Comment:

Please reread the first post where I explicitly talked about shared
connection behaviour.

 The bug is that when using shared connections, if you ever use
mysql_close() *and* set your links to null, your shared connections
will be closed prematurely.

 As outlined above, the net result of the is that you can never call
mysql_close() on a shared connection and expect to have it work
correctly.


Previous Comments:


[2005-04-27 14:48:13] [EMAIL PROTECTED]

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

When using same connection parameters no new connection will be
established by default, instead an exisiting one will be reused. Set
the optional newlink parameter to true if you want to establish more
than one physical connection.



[2005-04-27 13:25:23] kevin at hatry dot com

i just want to add a last comment to make clear that this bug is
important.

this is (i think) a much used type of program :

?php
function do_something_in_mysql () {
 $link3 = mysql_connect('localhost','root','',false);
 // do some common queries here
 mysql_close($link3);
 echo link3:; var_dump($link3);
}

$link1 = mysql_connect('localhost','root','',false);
echo link1:; var_dump($link1);

do_something_in_mysql();

// here $link1 is UNUSABLE !!
mysql_close($link1);

echo link1:; var_dump($link1);
?

fails with :
link1:resource(4) of type (mysql link)
link3:resource(4) of type (mysql link)
Warning: mysql_close(): 4 is not a valid MySQL-Link resource in ... on
line 14
link1:resource(4) of type (Unknown)

i think that closing a connection in the same environnement that it was
open (like in the function here) is good programming so it shouldn't
fail like that !

And the problem is *not* that the mysql_close closed all connections as
shown by this example :

?php
function do_something_in_mysql () {
 $link3 = mysql_connect('localhost','root','',false);
 echo link3:; var_dump($link3);
 // do some common queries here
 mysql_close($link3);
}

$link1 = mysql_connect('localhost','root','',false);
$link2 = mysql_connect('localhost','root','',false);

echo link1:; var_dump($link1);
echo link2:; var_dump($link2);

do_something_in_mysql();
// here $link1 is still USABLE
mysql_close($link1);

echo link1:; var_dump($link1);
echo link2:; var_dump($link2);

?

here there is no failure :
link1:resource(4) of type (mysql link)
link2:resource(4) of type (mysql link)
link3:resource(4) of type (mysql link)
link1:resource(4) of type (Unknown)
link2:resource(4) of type (Unknown)

there would be one if we had closed $link2 after $link1 for example.



[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 

#30525 [Bgs-Opn]: mysql_close() fails in some situations with shared links

2004-10-21 Thread l dot cameron2 at ugrad dot unimelb dot edu dot au
 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:   Bogus
+Status:   Open
 Bug Type: MySQL related
 Operating System: Fedora Core 2
 PHP Version:  5.0.2
 New Comment:

Yes, it was accidentally submitted twice, but I already Bogused the
second submission ;) -- this should still be open


Previous Comments:


[2004-10-22 07:05:55] [EMAIL PROTECTED]

Submitted twice (see #30526).



[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 /
bWarning/b:  mysql_close(): 1 is not a valid MySQL-Link resource in
b/home/levi/public_html/mysql2.php/b on line b10/bbr /



(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=30525edit=1