“数据库的打开句柄过多”和ibase_prepare

时间:2019-11-06 09:36:42

标签: php firebird firebird-3.0

在我的新品牌AWS服务器上,PHP和Firebird DB遇到了很大的问题。

当前配置:

  • Debian 10(破坏者)
  • PHP 7.3.11-1〜deb10u1(cli)(建立:2019年10月26日14:14:18)(NTS)
  • LI-V3.0.5.3310 Firebird 3.0 Super

这不是我的应用程序中的真实代码,但是几天后,我认为这是问题所在:

$dbh = ibase_connect('localhost:/*****/temp.fdb', 'SYSDBA', '*****');
$stmt = 'SELECT field_id FROM A0000';
$sth = ibase_query($dbh, $stmt);
while ($row = ibase_fetch_object($sth)) {

    $stmt0 = "SELECT * FROM A0000 WHERE field_id=?";
    $pstm0 = ibase_prepare($dbh, $stmt0);

    $sth0 = ibase_execute($pstm0, $row->field_id);
    $row0 = ibase_fetch_object($sth0);

    echo $row0->field_id . "\n";

    ibase_free_query($pstm0);
    ibase_free_result($sth0);

    $sth0 = null;
    $pstm0 = null;

}
ibase_free_result($sth);
ibase_close($dbh);

很明显,ibase_prepare超出了循环的范围,以实现真正的性能。

这个简单的代码使Firebird因“数据库的打开句柄过多”而出错(大约64000次迭代,而Firebird具有16GB RAM)。

我们旧服务器(PHP 5.3 / Firebird 2.5)上的相同代码可以正常工作。

使用此代码,所有代码都可以完美运行(即使在新服务器上):

$dbh = ibase_connect('localhost:/*****/temp.fdb', 'SYSDBA', '*****');
$stmt = 'SELECT field_id FROM A0000';
$sth = ibase_query($dbh, $stmt);
while ($row = ibase_fetch_object($sth)) {

    $stmt0 = "SELECT * FROM A0000 WHERE field_id=?";

    $sth0 = ibase_query($dbh, $stmt0, $row->field_id);
    $row0 = ibase_fetch_object($sth0);
    echo $row0->field_id . "\n";

    ibase_free_result($sth0);

    $sth0 = null;
}
ibase_free_result($sth);
ibase_close($dbh);

似乎问题出在从未发布的ibase_prepare。

我的代码有问题吗?

0 个答案:

没有答案