PDO PHP игнорирует параметр ATTR_TIMEOUT для MySQL, когда сервер не может быть достигнут

Я тестирую сценарии, в которых сервер mysql не может быть достигнут, помещая случайный IP-адрес, к которому нужно подключиться. Я установил опции PDO на тайм-аут через одну секунду, используя PDO::ATTR_TIMEOUT => 1 . Однако для исключения исключений требуется еще 30 секунд. Я предполагаю, что этот тайм-аут применим только к фактическому времени соединения mysql, а не к серверу, на котором работает mysql.

Какие параметры PHP мне нужно изменить, чтобы отключить соединение с сервером mysql?

Просто положите

 ini_set("default_socket_timeout", 2); 

перед вашей связью PDO ().

(Протестировано в Windows, также должно быть хорошо на Linux.)


Зачем?

Преследуя это через руководство:

Драйвер mysqlnd использует сокеты для базового соединения, а для установки тайм-аутов вам необходимо использовать функции тайм-аута сокета (потока). (Ссылка: http://php.net/manual/en/mysqlnd.notes.php )

Использование mysqlnd означает использование потоков PHP для базовой связи. Для mysqlnd в документации по потокам PHP (потоки) следует обращаться к таким деталям, как настройки тайм-аута, а не к документации для клиентской библиотеки MySQL.


Если вы хотите получить больше контроля, тогда вы сможете более точно управлять фактическим сокетом: я не тестировал это, так как это только unix. Чтобы установить сокет mysqlnd, вы можете указать сокет, используя ini-настройки (Ref: http://php.net/manual/en/ref.pdo-mysql.connection.php )

Если PDO_MYSQL скомпилирован против mysqlnd, сокет по умолчанию может быть установлен через параметр pdo_mysql.default_socket.

См. http://php.net/manual/en/ref.pdo-mysql.php#ini.pdo-mysql.default-socket об этой настройке

Возможно, вы сможете установить таймаут, используя http://php.net/manual/en/function.stream-set-timeout.php

Но, возможно, проще установить значение по умолчанию, а затем сбросить, как только вы закончите …

На php.ini вы можете обновить эту конфигурационную переменную:

 mysql.connect_timeout = 1 

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

https://github.com/phalcon/cphalcon/blob/2.0.0/phalcon/db/adapter/pdo.zep#L135-L149

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

В документе четко указано, что это может не означать интервал времени ожидания соединения, или иногда драйвер не поддерживает его.


     $ host = '192.168.1.36';
     $ dbname = 'test';
     $ username = 'test';
     $ password = '';

     $ start = time ();
     пытаться {
         $ db = новый PDO (
             "MySQL: хост = $ хост; имя_бд = $ имя_бд", 
             $ Имя пользователя, 
             $ Пароль,
             массив (
                 PDO :: ATTR_TIMEOUT => 1,
                 PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION
             )
         );
     } catch (Исключение $ e) {
         echo time () - $ start;
         echo "\ n";
         echo $ e-> getMessage ();
     }

Этот фрагмент кода должен решить вашу проблему.

разница mysqli, mysqlnd, pdo-mysql:

  • (устаревший) mysqlnd означает встроенный драйвер msyql, функции которого являются процедурными
  • mysqli object form of mysql diriver
  • pdo-mysql – это плагин для абстракции базы данных pdo для поддержки подключения к базе данных mysql.