Запуск PHP скрипт в качестве заданий cron - тайм-аут? - программирование
Подтвердить что ты не робот

Запуск PHP скрипт в качестве заданий cron - тайм-аут?

Я кодирую php script, который делает некоторые вещи назад и должен запускаться каждые 8 ​​часов или около того. Для выполнения script требуется некоторое время. К черту это, я попробовал это из своего браузера, и соединение с сервером получает reset задолго до того, как script завершается. Мой вопрос: если я запускаю его напрямую, т.е. php -a file.php как задание cron, существуют ли какие-либо внутренние ограничения времени на выполнение? Этот script может занять 2-5 минут и не может быть прерван. Я никогда не делал этого раньше, поэтому я не уверен, что php имеет причуды при работе с тяжелыми сценариями.

4b9b3361

Ответ 1

Как уже было сказано, скрипты CLI по умолчанию не имеют ограничения по времени.

Но я также хотел бы упомянуть альтернативу вашему подходу к работе cron:
Вы можете развить CLI PHP скрипт с помощью PHP скрипт под управлением веб-сервера. Я делал это много раз. Это особенно полезно, если у вас есть script с большим временем выполнения, которое должно быть вызвано действием какого-либо веб-сайта (например, создание очень большого архивного файла и отправка ссылки по электронной почте по завершении файла). Обычно я запускаю CLI script с веб-сервера PHP скрипт с помощью функции popen(). Это позволяет хорошо переносить параметры в новый экземпляр script следующим образом:

$bgproc = popen('php "/my/path/my-bckgrnd-proc.php"', 'w');
if($bgproc===false){
  die('Could not open bgrnd process');
}else{
  // send params through stdin pipe to bgrnd process:
  $p1 = serialize($param1);
  $p2 = serialize($param2);
  $p3 = serialize($param3);
  fwrite($bgproc, $p1 . "\n" . $p2 . "\n" . $p3 . "\n");
  pclose($bgproc);
}

В CLI script вы получите эти параметры, подобные этому...

$fp = fopen('php://stdin', 'r');
$param1 = unserialize(fgets($fp));
$param2 = unserialize(fgets($fp));
$param3 = unserialize(fgets($fp));
fclose($fp);

... и делать что-нибудь с ними, что долгое время под контролем веб-сервера.

Эта техника работает одинаково хорошо в средах * nix и Windows.

Ответ 2

Нет никаких временных ограничений для самого php при выполнении php из командной строки.

Но могут быть и другие таймауты, такие как соединения с mysql. Поэтому, если у вас есть соединение mysql в коде, обязательно сохраните его или установите таймаут mysql на что-то достаточно высокое, чтобы запустить ваш код. Другое дело: я видел, как некоторые провайдеры веб-хостинга убивали приложения php, запущенные более чем через несколько минут. Поэтому убедитесь, что ваш провайдер не делает этого.

Ответ 3

По умолчанию PHP-скрипты разыгрываются через 30 секунд, которые можно переопределить, отредактировав PHP.ini или добавив это вверху вашего script.

set_time_limit(0);

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

Кроме того,

Вы можете добавить это в свой script и открыть его в своем браузере, чтобы запустить script, и он будет запускаться так, как если бы вы открыли его в браузере и не открывали браузер.

ignore_user_abort();

Он просто запускает script в фоновом режиме. Они оба были бы полезны для вас.

ADD: Когда скрипты запускаются из командной строки Cli, тайм-аут по умолчанию равен 0. (Нет таймаута)