php mysql connect timeout
Php mysql connect timeout
Имя | По умолчанию | Место изменения | Список изменений |
---|---|---|---|
mysql.allow_local_infile | «1» | PHP_INI_SYSTEM | |
mysql.allow_persistent | «1» | PHP_INI_SYSTEM | |
mysql.max_persistent | «-1» | PHP_INI_SYSTEM | |
mysql.max_links | «-1» | PHP_INI_SYSTEM | |
mysql.trace_mode | «0» | PHP_INI_ALL | |
mysql.default_port | NULL | PHP_INI_ALL | |
mysql.default_socket | NULL | PHP_INI_ALL | |
mysql.default_host | NULL | PHP_INI_ALL | |
mysql.default_user | NULL | PHP_INI_ALL | |
mysql.default_password | NULL | PHP_INI_ALL | |
mysql.connect_timeout | «60» | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.
Краткое разъяснение конфигурационных директив.
Разрешает доступ к локальным файлам, с точки зрения PHP, с помощью инструкций LOAD DATA
Максимальное количество постоянных соединений c MySQL на один процесс.
Максимальное количество соединений с MySQL на один процесс, включая постоянные соединения.
Имя сокета по умолчанию, используемого для соединения с локальной базой данных, если не был указан другой.
Адрес сервера по умолчанию, используемый для соединения с сервером базы данных, если не указан другой. Не работает в SQL safe mode.
Имя пользователя по умолчанию, используемое для соединения с сервером базы данных, если не указано другое. Не работает в SQL safe mode.
Пароль по умолчанию, используемый для соединения с сервером базы данных, если не указан другой. Не работает в SQL safe mode.
Время ожидания ответа до разрыва соединения в секундах. Linux также использует это значение при ожидании первого ответа от сервера.
Php mysql connect timeout
Имя | По умолчанию | Место изменения | Список изменений |
---|---|---|---|
mysql.allow_local_infile | «1» | PHP_INI_SYSTEM | |
mysql.allow_persistent | «1» | PHP_INI_SYSTEM | |
mysql.max_persistent | «-1» | PHP_INI_SYSTEM | |
mysql.max_links | «-1» | PHP_INI_SYSTEM | |
mysql.trace_mode | «0» | PHP_INI_ALL | |
mysql.default_port | NULL | PHP_INI_ALL | |
mysql.default_socket | NULL | PHP_INI_ALL | |
mysql.default_host | NULL | PHP_INI_ALL | |
mysql.default_user | NULL | PHP_INI_ALL | |
mysql.default_password | NULL | PHP_INI_ALL | |
mysql.connect_timeout | «60» | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.
Краткое разъяснение конфигурационных директив.
Разрешает доступ к локальным файлам, с точки зрения PHP, с помощью инструкций LOAD DATA
Максимальное количество постоянных соединений c MySQL на один процесс.
Максимальное количество соединений с MySQL на один процесс, включая постоянные соединения.
Имя сокета по умолчанию, используемого для соединения с локальной базой данных, если не был указан другой.
Адрес сервера по умолчанию, используемый для соединения с сервером базы данных, если не указан другой. Не работает в SQL safe mode.
Имя пользователя по умолчанию, используемое для соединения с сервером базы данных, если не указано другое. Не работает в SQL safe mode.
Пароль по умолчанию, используемый для соединения с сервером базы данных, если не указан другой. Не работает в SQL safe mode.
Время ожидания ответа до разрыва соединения в секундах. Linux также использует это значение при ожидании первого ответа от сервера.
Глава 9. Загадочное исчезновение сервера.
Часто это выглядит так:
Перед тем как указать на причину возникновения ошибки мне бы хотелось обратить ваше внимание на несколько сиситемных переменных MySQL сервера. Это переменные, отвечающие за timeout:
Ниже приведены их описания:
Сколько ждать ответа сервера перед тем как выдать ошибку о том, что сервер не отвечает.
Сколько ждать активности от интерактивного клиента перед тем как разорвать соединение.
Сколько ждать активности от любого клиента перед тем как разорвать соединение. Если клиент интерактивный и значение interactive_timeout отличается от wait_timeout, то будет использовано значение interactive_timeout.
Сколько ждать ответа на запрос SELECT
Сколько ждать ответа на запрос, модифицирующий данные.
В приведённом выше примере проблема была в том, что мы ждали слишком долго для предварительно установенного маленького wait_timeout:
время ожидания: 3>1, поэтому не удивительно, что мы получили ошибку.
Естественно sleep(3) был добавлен только для наглядности. В случае реального приложения следует обратить внимания на места, где такая задержка может быть вызвана в том числе кодом без использования sleep и подобных функций.
Также проверяйте другие timeout-ы в случае аналогичных ошибок.
Приём 16: проверяйте значение wait_timeout и других timeout-ов, если вы встречаете ошибку «MySQL server has gone away»
Также я хотела бы обратить ваше внимание на то, что вы не всегда получите сообщение «MySQL server has gone away» в случае слишком маленького timeout. Это также может быть сообщение Lost connection to MySQL server at ‘reading authorization packet’. Чаще всего такое сообщение говорит о проблеме с connect_timeout.
Для примера я не смогла найти сети с достаточными для повторения проблемы перебоями, поэтому применила отладчик.
Запускаем интерпретатор PHP под отладчиком gdb:
Устанавливаем breakpoint в клиентской функции MySQL C API:
Передаём имя файла с PHP скриптом интерпретатору:
Когда интерпретатор останавливается ждём 11 секунд, что на 1 секунду больше предустановленного значения connect_timeout, затем вводим команду с (продолжить).
(gdb) c
Continuing.
PHP Warning: mysql_connect(): Lost connection to MySQL server at ‘reading authorization packet’, system error: 0 in /Users/apple/Documents/www_project/MySQL/Conferences/phpconf2009_3.php on line 2
Warning: mysql_connect(): Lost connection to MySQL server at ‘reading authorization packet’, system error: 0 in /Users/apple/Documents/www_project/MySQL/Conferences/phpconf2009_3.php on line 2
В результате иы получили ошибку Lost connection to MySQL server at ‘reading authorization packet’, что говорит о слишком маленьком connect_timeout
Проблемы с connect_timeout чаще всего свидетельствуют либо о нестабильной работе сети между клиентом и MySQL сервером, либо о том, что машина, на которой запущен MySQL сервер, перегружена.
Поэтому после того как вы проверили помогает ли увеличение timeout, попытайтесь найти и устранить реальную причину такого поведения, если это возможно.
Не увеличивайте connect_timeout без необходимости: никому не пронравится ждать слишком долго!
Приём 17: проверяйте значение connect_timeout в случае ошибки Lost connection to MySQL server at ‘reading authorization packet’
PHP mysql_connect set wait_timeout [duplicate]
We’re using the mysql_connect method in PHP to create database handles for a daemon. The problem is, that connection might not be used for more than 8 hours (sometimes for more than a few weeks.)
We’re running into issues where MySQL will end the session because the wait_timeout is reached. http://dev.mysql.com/doc/refman/5.0/en/gone-away.html
We don’t want to increase this value for ALL connections. Is there a way to increase the timeout for that handle only through PHP? Through MySQL?
2 Answers 2
It’s not good to hang onto DB connections for long periods because the DB only provides a fixed number of connections at any one time; if you’re using one up for ages it means your DB has less capacity to deal with other requests, even if you’re not actually doing anything with that connection.
I suggest dropping the connection if the program is finished using it for the time being, and re-connect when the time comes to do more DB work.
In addition, this solution will protect your program from possible database downtime, ie if you need to reboot your DB server (it happens, even in the best supported network). If you keep the connection alive (ie a DB ping as per the other answers), then an event like that will leave you with exactly the same problem you have now. With a properly managed connection that is dropped when not needed, you can safely leave your daemon running even if you have planned downtime on your DB; as long as it remains idle for the duration, it needn’t be any the wiser.
(as an aside, I’d also question the wisdom of writing a PHP program that runs continuously; PHP is designed for short duration web requested. It may be capable of running long term daemon programs, but there are better tools for the job)
How to setup a connection timeout depending of the user login in MySQL
I have currently more than 100 connections in Sleep state.
Some connection must stay in Sleep state (and don’t close) because it’s permanent connection but some others (with a different user name) are from some php script and I want them to timeout very fast.
Is it possible to setup a wait_timeout per user? and if yes, How?
7 Answers 7
There’s no per-user timeout configuration, but you can set the wait_timeout value dynamically. That is, after you make a connection as a given user, you can issue a statement to change the timeout value to what you want it to be for that user’s session.
Try the following experiment in the mysql command-line client:
Then you can quit the session, reconnect, and again the default wait_timeout is 28800. So it’s limited to the scope of the current session.
You can also open a second window and start a separate mysql client session, to prove that changing the wait_timeout in one session does not affect other concurrent sessions.
You should set the following variables in your my.conf :
wait_timeout is a timeout for automated connections (in my opinion more than 30 on a web server is too much).
interactive_timeout is a console interaction timeout for idle session.
Another possibility: MySQL supports two different timeout variables, wait_timeout for non-interactive clients, and interactive_timeout for interactive clients.
The difference between interactive and non-interactive clients seems to be simply whether you specified the CLIENT_INTERACTIVE option when connecting.
I don’t know if this helps you, because you need to somehow make mysql_real_connect() pass that option in its client_flag parameter. I’m not sure what language or interface you’re using, so I don’t know if it permits you to specify this connection flag.
Anyway if you can pass that client flag, and you only need two different types of users, then you could configure wait_timeout and interactive_timeout differently in the MySQL server config, and then use the one with the shorter value when you want a given session to time out promptly.