Невозможно разбудить детей даже после выхода из предыдущих

У меня есть виртуальная машина 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 и это решит вашу проблему.

Другие вопросы по тегам