首页 > 解决方案 > “数据库打开的句柄太多”和 ibase_prepare

问题描述

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

当前配置:

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

$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 的 RAM 为 16GB。

我们旧服务器(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。

我的代码有问题吗?

标签: phpfirebirdfirebird-3.0

解决方案


推荐阅读