php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #48447 After FORK Interbase doesn't work
Submitted: 2009-06-01 17:02 UTC Modified: 2021-03-31 11:35 UTC
Votes:5
Avg. Score:4.2 ± 1.0
Reproduced:5 of 5 (100.0%)
Same Version:0 (0.0%)
Same OS:1 (20.0%)
From: jjoss at mail dot ru Assigned:
Status: Suspended Package: InterBase related
PHP Version: 5.2.9 OS: Ubuntu Linux 2.6.18
Private report: No CVE-ID: None
View Add Comment Developer Edit
Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know!
Just going to say 'Me too!'? Don't clutter the database with that please — but make sure to vote on the bug!
Your email address:
MUST BE VALID
Solve the problem:
6 + 4 = ?
Subscribe to this entry?

 
 [2009-06-01 17:02 UTC] jjoss at mail dot ru
Description:
------------
After using the pcntl_fork() function both parent and child are not able to connect to the database.

Reproduce code:
---------------
<?php
  function dbGet($name)
  {
    echo $name.": ".getmypid()."\n";

    $dbLogin    = 'user';
    $dbPassword = 'password';
    $dbDB       = 'localhost:database';
    $dbCharset  = 'WIN1251';
    $dbDialect  = 3;
    $dbRole     = '';

    $dbh = ibase_connect($dbDB, $dbLogin, $dbPassword, $dbCharset, 0, $dbDialect, $dbRole);
    if (!$dbh)
    {
      echo $name.": connection error - ".ibase_errmsg()."\n";
      posix_kill(getmypid(), 9);
    }

    $query = "SELECT * FROM SOMETABLE;";
    if (!$dbResult = ibase_query($dbh, $query))
    {
      echo $name.": query error - ".ibase_errmsg()."\n";
      posix_kill(getmypid(), 9);
    }

    $row = ibase_fetch_row($dbResult);
    ibase_free_result($dbResult);
    ibase_commit();

    if (empty($row)) echo $name.": row empty - ".ibase_errmsg()."\n";
    else echo $name.":\n".print_r($row, true);
  }

//  $error_reporting_level = error_reporting(0);
//  error_reporting($error_reporting_level);
  error_reporting(0);
  dbGet('grandpa');

    //    $this->obj->Log->debug('ReportGeneric before fork ('.getmygid().')');
  $pid = pcntl_fork();
  if ($pid == -1) die('fork error');
  if ($pid)
  {
    // PARENT
    dbGet('parent');
    posix_kill(getmypid(), 9);
  }
  else
  {
    // CHILD
    dbGet('child');
    posix_kill(getmypid(), 9);
  }
?>

Expected result:
----------------
$ php fork_interbase.php
grandpa: 27850
grandpa:
Array
(
    [0] => 1
)
child: 27852
child:
Array
(
    [0] => 1
)
parent: 27850
parent:
Array
(
    [0] => 1
)
Killed
$

Actual result:
--------------
$ php fork_interbase.php
grandpa: 27850
grandpa:
Array
(
    [0] => 1
)
child: 27852
parent: 27850
parent: row empty - Unable to complete network request to host "localhost". Error writing data to the connection. Broken pipe
child: query error - Unable to complete network request to host "localhost". Error reading data from the connection.
Killed
$


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2011-06-03 09:37 UTC] mariuz@php.net
-Assigned To: +Assigned To: mariuz
 [2012-01-05 09:05 UTC] steffen at kernelguy dot dk
If I only call ibase_connect from the child code it works.

What I'm doing:
From a php script run by apache I exec a spawn.php script which again calls pcntl_fork.
I can access the database before the fork, which is successfull.
Then after the fork I get the error below when I try to start a new transaction, even after creating a new connection with ibase_connect:

"WARNING ibase_trans(): Unable to complete network request to host "localhost". Error writing data to the connection."

If I dont access the database before the fork, then the child code works. So that's my workaround for now.
 [2012-11-21 08:41 UTC] steffen at kernelguy dot dk
I can confirm this problem.
I'm using it the same way in a spawned process and normally it works just fine.
However:
If I restart the firebird process the forked process keeps getting the transaction error message.
I have tried everything I can think of when I get the error:
ibase_close($db_handle);
$db_handle = null;
Sleep(2);
ibase_connect or ibase_pconnect; // Tried both
ibase_trans; // Always fails

So for the last year I have been restarting my process, after a firebird restart.
 [2017-10-24 06:46 UTC] kalle@php.net
-Status: Assigned +Status: Open -Assigned To: mariuz +Assigned To:
 [2019-03-23 16:40 UTC] lester at lsces dot co dot uk
This is another facet of the problem of trying to use the same database multiple times. If I close the connection before forking, then a new resource is created in the child or the parent and works. Not sure just what is intended here as I can't see how you would carry the open connection to a different thread?
 [2021-03-31 11:35 UTC] cmb@php.net
-Status: Open +Status: Suspended
 [2021-03-31 11:35 UTC] cmb@php.net
The interbase extension is moved to PECL[1] as of PHP 7.4.0, and
is looking for a new maintainer.  Until a new maintainer is found,
I suspend this ticket.

Consider to use the bundled PDO_Firebird extension, or the
php-firebird package[2] instead.

[1] <https://pecl.php.net/package/interbase>
[2] <https://github.com/FirebirdSQL/php-firebird>
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Mar 19 02:01:28 2024 UTC