Я тестирую сценарии, в которых сервер 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: