Установка таймаута соединения с PDO

Я использую PDO для получения данных с сервера SQL. Я заметил следующее: если SQL-сервер недоступен, для этого кода требуется довольно (относительно), чтобы вернуть исключение:

try {
  $handle = new PDO($db_type . ':host='.$db_host.';dbname='.$db_name,$db_user,$db_pass);
  // Tried using PDO::setAttribute and PDO::ATTR_TIMEOUT here
} catch(PDOException $e) {
  echo $e->getMessage;
}

В случае MySQL для возникновения исключения требуется более 2 минут (SQLSTATE [HY000] [2003] Не удается подключиться к серверу MySQL на...) и 30 секунд на PostgreSQL (SQLSTATE [08006] [7 ] истекло).

Я попытался использовать PDO:: setAttribute и PDO:: ATTR_TIMEOUT, но он не работает. Я думаю, это имеет смысл, так как проблема возникает перед этим утверждением.

Есть ли способ установить тайм-аут для подключения к БД? 2 минуты /30 секунд кажется мне очень долгим для PDO, чтобы понять, что там ничего нет.

Я думаю, что видел, как это делается где-то, но не могу найти его снова для жизни.

Ответ 1

$DBH = new PDO(
    "mysql:host=$host;dbname=$dbname", 
    $username, 
    $password,
    array(
        PDO::ATTR_TIMEOUT => "Specify your time here (seconds)",
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    )
);

Ответ 2

Я использую драйвер DBLIB для PDO - и это не поддерживает передачу параметров (выдает предупреждение).

Чтобы обойти это, вы можете отредактировать параметр connection_timeout в конфигурационном файле FreeTDS, который находится в /etc/freetds/freetds.conf (на Ubuntu).