"слишком много открытых дескрипторов базы данных" и ibase_prepare - PullRequest
0 голосов
/ 06 ноября 2019

На моем новом сервере 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 никогда не выпускается.

Мой код неисправен

...