Фатальная ошибка PHP: Uncaught HY000: «Адаптивное соединение с сервером истекло» - PullRequest
0 голосов
/ 11 ноября 2018

Я запускаю сценарий PHP для подключения к MsSQL и выполнения длительной хранимой процедуры. Эта процедура ожидает идентификатор, который я передаю через этот скрипт. Я перебираю весь массив ID и вызываю эту процедуру. Однако для некоторых идентификаторов эта процедура требует много времени для запуска и времени ожидания. Я установил для свойства ATTR_TIMEOUT PDO значение 600 с. У меня есть все операторы PDO внутри блока try catch. Тем не менее, я получаю это необъяснимое исключение. Вот мой пример кода: (Пожалуйста, игнорируйте параметры new_statement. Я использовал здесь манекены. Он действительный и работает нормально)

try {
$statement = PDO::new_statement('DB', $sql, 0, false, false, [PDO::ATTR_TIMEOUT => 600]);
$this->execute($statement);
} catch (Exception $e) {
$logger->error("Error for ID: " . $id);
}

Это прекрасно работает для большинства идентификаторов. Это не работает для некоторых длительных идентификаторов. Если при выполнении запроса возникнет проблема TIMEOUT, я ожидаю, что ошибка будет зарегистрирована. Однако я вижу это исключение:

Неустранимая ошибка PHP: Uncaught HY000 ["HY000", 20003, "Время подключения адаптивного сервера истекло [20003] (уровень серьезности 6)

Может кто-нибудь, пожалуйста, помогите мне с этим.

1 Ответ

0 голосов
/ 11 ноября 2018

Передайте параметры конструктору PDO:

$pdo = new PDO(
    "mysql:host=$host;dbname=$dbname", 
    $username, 
    $password,
    array(
        PDO::ATTR_TIMEOUT => "(seconds)",
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    )
);

, если это не помогает, вы можете попробовать установить connect_timeout вручную в php.ini или использовать ini_set ()

mysql.connect_timeout = "(seconds)"

Если драйвер использует сокеты для основного соединения и для установки таймаутов, вам необходимо использовать функцию тайм-аута сокета (потока)

ini_set ("default_socket_timeout", "(seconds)");

Вы также должны знать, что

PDO :: ATTR_TIMEOUT: указывает время ожидания в секундах.Не все драйверы поддерживают эту опцию, и ее значение может отличаться от драйвера к драйверу.Например, sqlite будет ожидать до этого значения времени, прежде чем отказаться от получения доступной для записи блокировки, но другие драйверы могут интерпретировать это как интервал ожидания соединения или чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...