У меня есть некоторые агенты, и после нескольких недель обычного режима, мы получаем:
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 );
не будет никакой очистки.