Edit report at https://bugs.php.net/bug.php?id=72175&edit=1
ID: 72175
Comment by: netvicious at gmail dot com
Reported by: netvicious at gmail dot com
Summary: Impossibility of creatiing multiple connections to
Interbase with php 7.0
Status: Assigned
Type: Bug
Package: InterBase related
Operating System: Ubuntu 16.04 LTS
PHP Version: 7.0.6
Assigned To: nikic
Block user comment: N
Private report: N
New Comment:
Hi nikic, thanks for assigning the bug.
The code:
$link = ibase_connect($foo);
$link2 = ibase_connect($foo);
ibase_close($link2);
That functions are similar to mysqli, but changing the type of the DB
ibase_connect = mysqli_connect
ibase_close = mysqli_close
If you close $link2, $link should remain open and working.
The current problem it's when you're creating a new connection to a database which has
another connection opened before in the same script. The first one should remain open and working
instead of being closed as it's done with the current interbase module.
Previous Comments:
------------------------------------------------------------------------
[2016-07-10 11:44:17] nikic@php.net
The resource refcount management in ext/interbase is in general very broken. It uses
zend_list_delete() in *_close() functions, which is not memory safe, and adds additional refs
elsewhere to compensate.
I'm not even clear on how some parts of this are *supposed* to work. For example, what should
this code do?
$link = ibase_connect($foo);
$link2 = ibase_connect($foo);
ibase_close($link2);
Should this ibase_close() call close all of $link, $link2 and the default link? After all, all of
these share the same connection. If ibase_close($link2) should not close $link, then we can't
reuse the same connection for both (or need to introduce a double indirection). Or make
ibase_close() effectively a no-op.
------------------------------------------------------------------------
[2016-07-08 15:57:55] nikic@php.net
I've tried applying the patch today (as well as interchanging the order of the recount
increments) -- which does fix this issue, but also makes many ext/interbase tests fail.
The problem seems to be additional warnings like this:
Warning: ibase_drop_db(): lock time-out on wait transaction object /tmp/php_ibase_testhj4JRc is in
use
I know nothing about interbase, so not sure what this is supposed to mean. My guess is that
interbase is finicky about getting all connections closed and using delete() instead of close() here
leaves connections open.
------------------------------------------------------------------------
[2016-06-28 15:35:05] nish dot aravamudan at canonical dot com
As part of https://bugs.launchpad.net/ubuntu/+source/php7.0/+bug/1578600,
I asked users to test:
--- php7.0-7.0.8.orig/ext/interbase/interbase.c
+++ php7.0-7.0.8/ext/interbase/interbase.c
@@ -939,7 +939,7 @@ static void _php_ibase_connect(INTERNAL_
xlink = (zend_resource*) le->ptr;
if ((!persistent && xlink->type == le_link) || xlink->type ==
le_plink) {
if (IBG(default_link)) {
- zend_list_close(IBG(default_link));
+ zend_list_delete(IBG(default_link));
}
xlink->gc.refcount++;
xlink->gc.refcount++;
And two users reported this fixed the issue for them. This was the suggestion of NikiC on SO
(http://stackoverflow.com/questions/37049534/multiple-connections-to-interbase-with-php-7-0).
------------------------------------------------------------------------
[2016-05-26 15:45:47] dregad at mantisbt dot org
A user of ADOdb library reported the same problem (see https://github.com/ADOdb/ADOdb/issues/231).
------------------------------------------------------------------------
[2016-05-09 07:23:18] netvicious at gmail dot com
Description:
------------
If you have one open link to an Interbase/Firebird database and you open **another** one to the same
database the first link it's closed.
On my php.ini I have this (exactly the same than on PHP 5.6):
ibase.allow_persistent = 1
; Maximum number of persistent links. -1 means no limit.
ibase.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
ibase.max_links = -1
The same script below was running perfectly on PHP 5.6
NikiC on StackOverflow writed this:
In particular, I don't think this line is correct:
lxr.php.net/xref/PHP_MASTER/ext/interbase/interbase.c#943 This zend_list_close should probably be a
zend_list_delete, otherwise it will simply always destroy the resource.
Already posted to:
http://stackoverflow.com/questions/37049534/multiple-connections-to-interbase-with-php-7-0
https://bugs.launchpad.net/ubuntu/+source/php7.0/+bug/1578600
Regards,
Test script:
---------------
// DB_xxx are defined variables with the users, password, ..... of the database.
// We have the same problem if we use ibase_pconnect or ibase_connect
$conx = ibase_connect(DB_HOST . ":" . DB_NAME,DB_USER,DB_PWD,DB_CHARACTER) or
die(ibase_errcode() . ' ' . ibase_errmsg());
$conx2 = ibase_connect(DB_HOST . ":" . DB_NAME,DB_USER,DB_PWD,DB_CHARACTER) or
die(ibase_errcode() . ' ' . ibase_errmsg());
$sql = 'SELECT something from somewhere';
$query = ibase_query($conx, $sql);
while ($row = ibase_fetch_assoc($query)) {
echo $row['something'];
}
Expected result:
----------------
$conx should keep the database connection instead of be closed.
Actual result:
--------------
The test script should not write nothing, but on the error log you will see something like:
supplied resource is not a valid Firebird/InterBase link resource in ....
ibase_fetch_assoc(): Dynamic SQL Error SQL error code = -504 Invalid cursor reference Cursor is
not open ....
It seems $conx has been closed when creating the $conx2 connection.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=72175&edit=1