Мой совет (из личного опыта по той же проблеме) - закрыть соединение до pcntl_fork()
, а затем при необходимости открыть новые соединения в родительском и / или дочернем процессах.
Если вы открываете новое соединение в родительском процессе , затем необходимо заблокировать сигнал SIGCHLD
(используя pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD)
).В дочерних процессах не требуется особой заботы (кроме случаев, когда они также запускают своих собственных детей, становясь родителями таким образом.)
SIGCHLD
- это сигнал, который получает родительский процесс, когда один из его дочерних элементов завершает работу..
Во время связи с сервером клиентская библиотека MySQL использует nanosleep()
, чтобы приостановить выполнение программы на некоторое время.Функции sleep()
возвращаются, когда время проходит, но они также возвращают до того, как пройдет время, если процесс получит сигнал, пока он приостановлен.
Когда nanosleep()
возвращается из-за сигнала (т. Е. До того, как прошло достаточно времени), библиотека MySQL сбивается с толку и сообщает об ошибке «Сервер MySQL исчез», и соединение больше не может использоваться.Это ложная тревога, сервер MySQL все еще там ожидает запросов, но код клиента дурачит сигнал, полученный в неправильный момент.
Если вы заинтересованы в получении сигнала SIGCHLD
, тогда вы можетезаблокируйте его перед выполнением запроса MySQL, а затем снова разблокируйте (чтобы избежать его получения во время связи с сервером MySQL.
Также прочитайте этот ответ и этот ответ Iписал по схожим вопросам (это та же информация, но с более подробными объяснениями)