Задать вопрос

Время выполнения php-скрипта по крону?

PHP скрипт работающий по крону делает curl-запросы.
Скрипт за раз должен обрабатывать 30 адресов но в случае длительного ожидания ответа у части из них (например 5 секунд) за минуту он не успеет обработать все 30. А через минуту cron запустит ещё одну копию скрипта уже со следующей пачкой в 30 штук.

Как решить такую ситуацию что бы скрипт не простаивал с одной стороны, но и что бы избежать накопления запущенных скриптов с другой?
  • Вопрос задан
  • 1434 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
запускать в отдельных процессах, если они у вас идут прям без остановки каждую минуту, то будет работать параллельно. Но будет накапливаться процессы. Так что в итоге скорее всего забъется процессами если не будет успевать отрабатывать.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
pidfile

стандартный *nix-way, это при запуске скрипта, проверять наличие pid-файла. Если файл есть - завершаем работу. Если файла нет - создаем его и начинаем обрабатывать задачу. После завершения работы - удаляем за собой pid-файл.

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

P.S. Более тщательная проверка заключается в том, что в этот файл сохранять PID процесса, и следовательно при запуске скрипт проверяет и наличие файла, и существование процесса, который в файле указан. Позволяет избежать проблем, если какой-то скрипт был прерван до завершения и не успел удалить за собой pid-файл.
Ответ написан
@yuras666
Вот, есть очень хорошая и компактная
статья на эту тему.
С Pid-файлом, что писали выше - тоже годное решение.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@DuD
Еще парочку вариантов подкину:
1) запускать скрипт в вечном цикле, а раз в минуту проверять что он жив.
В вечном цикле дергать 30 адресов в минуту, если уложились то спим, если нет то продолжаем впахивать.
2) Запускать не 1 скрипт, а несколько. Или запускать 1 срипт который породит несколько потомков. Таким образом при помощи параллелизма мы добиваемся увеличения допустимого времени на ответ. Т.е. если мы запустим 30 потомков то каждому сайту будет отведено чуть меньше минуты на ответ.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы