|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #31538 MySQLi disconnects after termination of child in master
Submitted: 2005-01-13 15:42 UTC Modified: 2005-02-28 21:13 UTC
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: rudy dot metzger at xs4all dot nl Assigned:
Status: Not a bug Package: MySQLi related
PHP Version: 5.0.3 OS: Fedora Core 3
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.
Bug Type:
From: rudy dot metzger at xs4all dot nl
New email:
PHP Version: OS:


 [2005-01-13 15:42 UTC] rudy dot metzger at xs4all dot nl
When connecting to a database, then forking off a new child, the database connection will be terminated (disconnected) when the child exits.

I have the feeling that at the "cleanup" of the child process the database connection is closed. This should not be the case because the master process might still use it.

This is not the case with the mysql extension, only with mysqli. With the mysql extension, you might be required to give the optional parameter "open new session" on the connect. at least this is what I did.

Reproduce code:

function ping_db( $res, $msg )
  if ( mysqli_ping($res) )
    echo getmypid()." $msg: still alive\n";
    echo getmypid()." $msg: died\n";

function SigChild( $signal )
  while ( ($pid=pcntl_wait($status,WNOHANG)) > 0 ) {
    if ( !pcntl_wifexited($status) )
      echo "Collected killed pid $pid\n";
      echo "Collected pid $pid\n";

pcntl_signal( SIGCHLD, 'SigChild' );

$res = mysqli_connect('localhost','zpc','zpc');
ping_db($res,'after connect');

$pid = pcntl_fork();
ping_db($res,'right after fork');

if ( !$pid ) {                  // --- the slave
  echo "child sleep\n";
  echo "child exiting\n";

ping_db($res,'after fork');

echo "master sleep\n";
ping_db($res,'after sleep');

while ( ($pid=pcntl_wait($status)) > 0 ) {
  if ( !pcntl_wifexited($status) )
    echo "Collected killed pid $pid\n";
    echo "Collected pid $pid\n";

mysqli_close( $res );


Expected result:
The database connection in the master should not have terminated.

Actual result:
6311 after connect: still alive
6313 right after fork: still alive
child sleep
6311 right after fork: still alive
6311 after fork: still alive
master sleep
child exiting
Collected pid 6313
6311 after sleep: died

In the last line you can see that the connection died (6311 is master, 6313 is child)


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2005-01-13 15:45 UTC] rudy dot metzger at xs4all dot nl
Used DB versions

 [2005-02-14 19:23 UTC] peter at netkey dot at
You need a seperate connection for each child, or MySQL will get confused. 
See the comment from Christophe C.

 [2005-02-28 21:13 UTC]

PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Fri Oct 15 21:03:43 2021 UTC