在我的新品牌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具有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。
我的代码有问题吗?