Bug #48447 [Opn->Sus]: After FORK Interbase doesn't work
| From: | cmb@php.net | Date: | Wed, 31 Mar 2021 11:35:54 +0000 |
| Subject: | Bug #48447 [Opn->Sus]: After FORK Interbase doesn't work | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-233086@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=48447&edit=1
ID: 48447
Updated by: cmb@php.net
Reported by: jjoss at mail dot ru
Summary: After FORK Interbase doesn't work
-Status: Open
+Status: Suspended
Type: Bug
Package: InterBase related
Operating System: Ubuntu Linux 2.6.18
PHP Version: 5.2.9
Block user comment: N
Private report: N
New Comment:
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>
Previous Comments:
------------------------------------------------------------------------
[2019-03-23 16:40:25] 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?
------------------------------------------------------------------------
[2012-11-21 08:41:18] 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.
------------------------------------------------------------------------
[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