Невозможно разбудить детей даже после выхода из предыдущих
У меня есть виртуальная машина CentOS, на которой я запускаю сервер сокетов php, который разветвляется при каждом подключении. Дочерний процесс выполняет свою работу и затем завершается.
Родитель также ждет, чтобы пожинать мертвый процесс зомби (я проверил ps auxf
выход)
pcntl_wait($status, WNOHANG);
выполняется после каждой форка, так что очищает 1 процесс Zombie (если есть)
Тем не менее, после длительного запуска, родитель не может разветвиться.
Я думаю, что это из-за 32768
предел. Номер процесса в ps -auxf
выход постоянно около 750.
[root@test-machine ~]# cat /proc/self/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 119925 119925 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 119925 119925 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
[root@test-machine ~]# cat /proc/sys/kernel/pid_max
32768
ОБНОВЛЕНИЕ: я проверил журналы и увидел сообщение об ошибке PHP Fatal error: Maximum execution time of 30 seconds exceeded in myfile.php
Линия, на которую он указал, является pcntl_wait($status, WNOHANG);
, для ожидания завершения дочернего процесса. WNOHANG
Флаг гарантирует, что он не зависает, поэтому, если нет дочернего объекта, он продолжит выполнение.
Хотя "Максимальное время" можно изменить, что-то вызывает pcntl_wait
цикл Я думаю, что-то в ОС делает это возможным. Это сокет с максимальным количеством соединений (у меня есть несколько сокетов, только это было затронуто)
1 ответ
Я проверил документацию PHP для функции prcntl_wait и нашел это:
опции
Если в вашей системе имеется wait3 (в основном системы в стиле BSD), вы можете указать необязательный параметр options. Если этот параметр не указан, для системного вызова будет использоваться ожидание. Если wait3 недоступен, предоставление значения для параметров не будет иметь никакого эффекта. Значением параметров является значение, равное нулю или более из следующих двух констант ИЛИ вместе:
Может быть, ваша ОС не имеет wait3, и это вызывает эту проблему. Может быть, вы могли бы изменить функцию на pcntl_waitpid
и это решит вашу проблему.