php - “数据库打开的句柄太多”和 ibase_prepare
问题描述
在我的新品牌 AWS 服务器上,我遇到了 PHP 和 Firebird DB 的大问题。
当前配置:
- Debian 10(破坏者)
- PHP 7.3.11-1~deb10u1 (cli) (build: Oct 26 2019 14:14:18) (NTS)
- LI-V3.0.5.3310 火鸟 3.0 超级
这不是我的应用程序中的真实代码,但几天后我认为这是问题所在:
$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。
我的代码有问题吗?
解决方案
推荐阅读
- react-native - 如何从登录页面获取用户名并在 React Native 的所有页面(组件)上动态使用它
- java - 致命:gpu_data_manager_impl_private.cc(439)] GPU 进程不可用。再见
- windows - 在 git bash(终端或脚本)中将 posix 路径转换为 windows?
- python - 即使我使用的是 readlines(),这些函数只允许我读取第一个非空行而不是之后的行?
- node.js - 如何使用 Ubuntu Apache2 将具有多个 Node 进程的 React 应用程序从 http 迁移到安全 https
- java - 将实时图像加载到 JLabel 中不适用于某些 url
- laravel - 我收到错误无法在 laravel 8 应用程序中找到工厂
- regex - Visual Studio 搜索:查找一个单词,但不是在特定单词之前
- python - 如何在python中连接两个csv文件
- javascript - 如何使用nodejs重置密码