Edit report at https://bugs.php.net/bug.php?id=48447&edit=1

 ID:                 48447
 Comment by:         steffen at kernelguy dot dk
 Reported by:        jjoss at mail dot ru
 Summary:            After FORK Interbase doesn't work
 Status:             Assigned
 Type:               Bug
 Package:            InterBase related
 Operating System:   Ubuntu Linux 2.6.18
 PHP Version:        5.2.9
 Assigned To:        mariuz
 Block user comment: N
 Private report:     N

 New Comment:

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.


Previous Comments:
------------------------------------------------------------------------
[2012-01-05 09:05:31] 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.

------------------------------------------------------------------------
[2009-06-01 17:02:33] 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
$



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=48447&edit=1

Reply via email to