На моем новом сервере AWS у меня возникла большая проблема с PHP и БД Firebird.
Текущая конфигурация:
- Debian 10 (buster)
- PHP7.3.11-1 ~ deb10u1 (cli) (сборка: 26 октября 2019 г. 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 с 16 ГБ ОЗУ.
Тот же код на нашем старом сервере (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 никогда не выпускается.
Мой код неисправен