Время работы скрипта на сервере

Рейтинг: 0Ответов: 3Опубликовано: 23.10.2014

Вот такой вопрос! Значит, есть готовый парсер на сервере, но он ни в какую не хочет работать, т.е. время работы скрипта на сервере ограничено установкой лимита времени set_time_limit(), а задача требует, чтобы парсер работал сутками и обновлял информацию! Может, подскажите, как заставить работать скрипт? Ведь на локальном сервере у меня все работает!

Ответы

▲ 2Принят

По порядку.

Для запуска скрипта на сервере с условно-бесконечным или просто большим временем выполнения надо так или иначе запускать его как консольный скрипт. Сервер - программа, которая не предназначена для того, чтобы один из ее воркеров выпла на условное навсегда, если парсер запускается в рамках обычного веб-запроса, то сервер вынужден делегировать один из своих потоков этому парсера, и ждать, когда он отработает (никогда). Если страница тридцать секунд не может вернуть ответ, значит, стоит вернуть ошибку ожидания пользователю. Вопрос не говорит о методе запуска скрипта, поэтому я на всякий уточнил.

Как запустить скрипт из консоли? Очень просто: подключиться к терминалу сервера и выполнить этот скрипт с помощью php: php script.php. В этом случае:

  • Не убивается воркер веб-сервера и вообще не участвует внешняя оболочка скрипта
  • По умолчанию max execution time неограничено
  • Не нужно форматировать вывод как html, плюс можно логировать вывод средствами самой ОС.

Это обеспечивает только одноразовый запуск скрипта, зато висеть он может хоть бесконечно.

Как регулярно запускать скрипт? Как ответили выше - по крону (планировщику заданий). 99%, что на сервере установлен linux, а значит планировщиком является cron. Подробную документацию вы найдете в интернете, задания редактируются с помощью crontab -e или в панели хостера и представляют из себя время выполнения и команду, которую необходимо исполнить - точно такую же, как в примере выше. Таким образом cron поможет запускать скрипт каждые N минут или гарантировать его перезапуск в случае падения.

Как убедиться, что скрипт отработал перед тем, как запускать его снова? Вот тут начинает прорастать филигранная работа. Проще всего оставлять некий .lock-файл при начале работы скрипта и затирать его в конце - в этом случае повторно запущенный скрипт проверит наличие файла, увидит его существование и откажется запускаться. Для того, чтобы избежать ситуаций, когда скрипт упал, а .lock-файл остался, можно записывать туда PID (идентификатор процесса). В этом случае повторно запущенный скрипт опрашивает ОС на предмет наличия процесса с таким PID, и если последний существует, то необходимо прекратить работу.

▲ 2

Такие задачи решаются через cron.

▲ 1
$start = microtime(true);  
# ...  
$time = microtime(true) - $start;  
printf('Скрипт выполнялся %.4F сек.', $time);

Может, сделать, чтобы скрипт выполнял свои действия порциями и дергался кроном.