Преждевременное завершение задания PHP cron из-за фатальной ошибки «Максимальное время выполнения» - PullRequest
5 голосов
/ 01 марта 2012

У меня задание PHP cron, которое не работает после 29 минут работы.Ошибка в журнале (/var/log/php_errors.log):

[01-Mar-2012 00:32:57 UTC] PHP Fatal error: Maximum execution time of 60 seconds exceeded in /path/file.php on line 2079

Запись в crontab, которая запускает cron:

00 00 * * * /usr/bin/php /path/file.php

Из моего исследования я не думаю, что это связанов настройку конфигурации max_execution_time, потому что:

  1. Я точно знаю, что он работал в течение 29:18 минут (т. е. намного больше, чем 60 с, как сообщение об ошибке).
  2. С Документы PHP - При запуске PHP из командной строки значение по умолчанию равно 0.

В: Почему скрипт завершается раньше?


Примечания:

Сценарий очень тяжелый и выполняет много тысяч запросов к БД, но я выполнял top и загрузка процессора была невысокой.

Строка из журнала ошибок: mysql_query вызов:

$sql = "SELECT SUM(amount) FROM mytab WHERE mem = '$id' AND validto > '$now'";
$res = mysql_query($sql);

> php -v
PHP 5.3.10 (cli) (built: Feb  2 2012 17:34:38) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
    with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH

> cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)

Обновление - я выяснил, почему скрипт может работать в течение 29 минутреального времени, но PHP может значительно сократить время выполнения цитирования.

Любое время, затрачиваемое на действия, происходящие вне выполнения сценария, такие как системные вызовыиспользование system (), потоковые операции, запросы к базе данных и т. д. не учитывается при определении максимального времени выполнения сценария.

(из set_time_limit () docs , но также упоминается в документация о максимальном времени выполнения ).Это было актуально для меня, потому что большая часть скрипта долго выполняла дБ-запросы и платежные API-вызовы, которые не будут приводить к увеличению времени выполнения.

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Ну, вы можете установить большее значение для ограничения по времени, или вы можете установить его неограниченным, используя set-time-limit () :

<?php set_time_limit(0); ?>

, но на самом деле я использую этотоже в начале скрипта

ignore_user_abort(1);
1 голос
/ 01 февраля 2013

Если вы получаете PHP Fatal error: Maximum execution time of 60 seconds exceeded, то наверняка какой-то фрагмент кода PHP запускает где-то оператор set_time_limit(60). Режим PHP CLI может по умолчанию не иметь ограничения по времени, но если любой путь кода когда-либо устанавливает ограничение по времени, это будет выполнено. Причина, по которой PHP работал почти полчаса, заключается в том, что set_time_limit устанавливает ограничение для времени ЦП, и если процесс ограничен вводом-выводом или ожидает других процессов, общее использование ЦП в реальном времени достигнет отметки 60 секунд намного позже таймер.

Попробуйте поискать по всему исходному коду set_time_limit. Если вы ничего не нашли, то добавьте set_time_limit(0) в начале скрипта, чтобы убедиться, что ограничение 60 секунд не исходит из локально модифицированного файла конфигурации. Например, в Ubuntu LTS конфигурация CLI PHP определена в /etc/php5/cli/php.ini.

1 голос
/ 01 марта 2012

К сожалению, я не могу написать комментарий, поэтому мой вопрос здесь будет, что произойдет, если вы запустите это вручную?Будет ли это также время ожидания?

Если он не истекает при запуске вручную, я бы посоветовал вам вызвать небольшой сценарий оболочки, который фактически запускает оболочку и запускает "/ usr / bin / php /path/file.php"внутри оболочки.

00 00 * * * /usr/local/scripts/start_php_job.sh

File: /usr/local/scripts/start_php_job.sh
#!/usr/bin/bash
date

/usr/local/bin/php /path/to/script

date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...