Максимальное время выполнения 300 секунд превышено в pcntl_fork ()

У меня есть некоторые агенты, и после нескольких недель обычного режима, мы получаем:

Maximum execution time of 300 seconds exceeded

на линии, которая

$this->pids[$next_child] = pcntl_fork();

также мы имеем:

 [root@a ~]# ulimit -u 385913 [root@a ~]# ps ax | wc -l 400 [root@a ~]# cat /proc/sys/kernel/pid_max 4194303 strace shows poll([{fd=4, events=POLLIN|POLLPRI|POLLHUP}], 1, 1000) = 0 (Timeout) 

мы находимся на php5.4 centos, может быть, это ошибка PHP? или что может быть неправильным?

Эта ошибка немного загадочна. Итак, мы должны выполнить некоторую отладку, чтобы разобраться в сути проблемы.

Примечание. Вместо того, чтобы сосредоточиться на функции pcntl_fork или PHP-ошибках. Я сконцентрируюсь на том, что это проблема системных ресурсов. Потому что строка, в которой он выдает ошибку, содержит fork. Мы увидим, откуда оно оттуда

  • Ошибка может быть ошибкой или несущественной. Чтобы проверить это, добавьте ini_set('MAX_EXECUTION_TIME', -1); на самом верху вашего скрипта. Если ваш скрипт работает без проблем, то это правда. Если нет, то мы должны изучить поведение. Если ваши агенты начинают испытывать проблемы с обслуживанием клиентов примерно в то время, когда они нормализуют ошибку, это может означать, что ошибка означает, что что-то по ряду ресурсов недостаточно. Если это не так, вам следует изучить поведение агентов, чтобы вы могли больше узнать о причине проблемы.

  • Ошибка может быть связана с тем, что кеш активного URL слишком высок, если вы используете его из того, что я слышал.

Если проблема по-прежнему сохраняется, вам необходимо предоставить дополнительную информацию о вашей среде и конфигурациях, чтобы мы могли вам помочь.

Вопрос: Вы случайно используете Magento?

Трудно сказать точно, не зная всей части кода … но мое первое наклонение состояло в том, чтобы убедиться, что вы должным образом убиваете процессы после завершения сценария. Без этого использование peek может исчерпать ресурсы для обработки нового процесса, но из-за их природы «умереть» очень по-разному.

Убедитесь, что вы не предполагаете, что вы убиваете процесс с выходом, попробуйте posix_kill( $this->pids[ $next_child ], 15 );

Вы можете попробовать использовать sig 9 вместо 15, но я бы не предложил использовать его на производстве, но это может помочь отладить проблему. На самом деле, вы можете проверить на 9, что может быть проблемой … posix_kill( $this->pids[ $next_child ], 9 ); не будет никакой очистки.