Я кодирую php-скрипт, который делает некоторые вещи назад и должен запускаться каждые 8 часов или около того. Для выполнения сценария требуется некоторое время. К черту это, я попробовал это из своего браузера, и соединение с сервером получает сброс задолго до завершения сценария. Мой вопрос: если я запускаю его напрямую, т.е. php -a file.php как задание cron, существуют ли какие-либо внутренние ограничения времени на выполнение? Этот скрипт может занять 2-5 минут и не может быть прерван. Я никогда не делал этого раньше, поэтому я не уверен, что php имеет причуды при работе с тяжелыми сценариями.
Как было сказано ранее, сценарии CLI по умолчанию не имеют ограничения по времени.
Но я также хотел бы упомянуть альтернативу вашему подходу к работе cron:
Вы можете развить скрипт CLI PHP из скрипта PHP под управлением веб-сервера. Я делал это много раз. Это особенно полезно, если у вас есть сценарий с большим временем выполнения, который должен запускаться с помощью некоторых действий пользователя сайта (например, создание очень большого архивного файла и отправка ссылки по электронной почте по завершении файла). Обычно я запускаю скрипт CLI из скрипта PHP веб-сервера, используя функцию popen (). Это позволяет легко передать параметры в новый экземпляр сценария следующим образом:
$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 вы получите следующие параметры …
$fp = fopen('php://stdin', 'r'); $param1 = unserialize(fgets($fp)); $param2 = unserialize(fgets($fp)); $param3 = unserialize(fgets($fp)); fclose($fp);
… и делать что-нибудь с ними, что долгое время под контролем веб-сервера.
Этот метод работает одинаково хорошо в средах * nix и Windows.
Нет никаких ограничений по времени в php при выполнении php из командной строки.
Но могут быть и другие таймауты, такие как соединения с mysql. Поэтому, если у вас есть соединение mysql в коде, обязательно сохраните его или установите таймаут mysql на что-то достаточно высокое, чтобы запустить ваш код. Другое дело: я видел, как некоторые провайдеры веб-хостинга убивали приложения php, запущенные более чем через несколько минут. Поэтому убедитесь, что ваш провайдер этого не делает.
По умолчанию скрипты PHP запускаются через 30 секунд, которые можно переопределить, отредактировав PHP.ini или добавив это в начало вашего скрипта.
set_time_limit(0);
Это устанавливает неограниченное время выполнения для вашего скрипта, то есть оно никогда не заканчивается, если скрипты не завершат выполнение, или сервер не опускается, или файл не удаляется, или не возникает фатальная ошибка.
Дополнительно,
Вы можете добавить это в свой скрипт и открыть его в своем браузере, чтобы запустить сценарий, и он будет запущен так, как если бы вы открыли его в браузере и не открывали браузер.
ignore_user_abort();
Он просто запускает сценарий в фоновом режиме. Они оба были бы полезны для вас.
ADD: Когда скрипты запускаются из командной строки Cli, тайм-аут по умолчанию равен 0. (Без таймаута)