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