Я использую 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, чтобы понять, что там ничего нет.
Кажется, я видел, как это делается где-то, но не могу найти его снова для жизни.
$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 ) );
Я использую драйвер DBLIB для PDO – и это не поддерживает передачу параметров (выдает предупреждение).
Чтобы обойти это, вы можете отредактировать параметр connection_timeout
в конфигурационном файле FreeTDS, который находится по адресу /etc/freetds/freetds.conf
(на Ubuntu).