Тайм-аут PHP oci?

Я хотел бы установить тайм-аут на запрос

$statement = oci_parse($conn, $query);
oci_execute($statement); // timeout if this takes over 5 minutes

это было задано раньше, но весь путь назад в 11 без твердого ответа

Запустите SQL-запрос с тайм-аутом в PHP или Как в PHP, чтобы остановить SQL-запрос, когда он уже начался?

Я нашел этот запрос также с прошлого года https://bugs.php.net/bug.php?id=73038

1 ответ

Решение

Драйвер PHP OCI не поддерживает тайм-ауты запросов (через PDO::ATTR_TIMEOUT) на интерфейсе с библиотекой Oracle. Таким образом, не существует прямого средства пользователь-земля для достижения этой цели.

Стандартный способ сделать это - выполнить отдельный процесс, который сам по себе имеет тайм-аут. Вы можете сделать это так:

// oci8-exec.php
set_time_limit(300); // 5 minutes
$conn = getDatabaseConnection();
$stmt = oci_parse($conn, $_SERVER['argv'][1]);
oci_execute($stmt);
oci_fetch_all($stmt, $rows);
var_export($rows);

тогда в вашем коде сделайте:

$rows = shell_exec('oci8-exec.php "select * from foo"');

Очевидно, что вам понадобится обработка ошибок, проверка кода выхода и т. Д., Чтобы подготовить эту работу.

Похоже, вы можете использовать oci_set_call_timeout для тайм-аутов вызова базы данных, начиная с oci82.2.0.

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
oci_set_call_timeout($conn, 5000);

?>
Другие вопросы по тегам