2010-05-11 3 views
0

У меня есть ежедневное задание cron, которое захватывает 10 пользователей за раз и делает с ними кучу вещей. Есть 1000 пользователей, которые являются частью этого процесса каждый день. Я не хочу, чтобы задания cron перекрывались, поскольку они тяжелы при загрузке сервера. Они называют материал различными API-интерфейсами, поэтому у меня есть тайм-ауты и медленная выборка данных.Ограничить количество заданий cron, выполняющих скрипт PHP

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

Есть ли хороший способ остановить выполнение задания cron при вызове PHP-скрипта несколько раз или контролировать количество раз, когда он вызывается, поэтому есть только три примера?

Я предпочел бы решение в PHP, если это возможно.

В настоящее время я храню флаг как значение в базе данных, лучше использует файл типа блокировки, как здесь https://stackoverflow.com/questions/851872/does-a-cron-job-kill-last-cron-execution?

ответ

3

Я использовал грязный способ отслеживания количества сценариев, выполняемых через таблицу в базе данных. Запущенный скрипт вставляет строку с id и поле started_time. При выходе он удаляет свою строку. Слишком старые строки считаются «неудачными \ мертвыми скриптами».

Рабочие сценарии не запускаются cron напрямую. Cron запускает «сценарий запуска» каждые 1 секунду или около того, который проверяет таблицу количества активных работников и порождает больше работников, если это необходимо.

Такая схема работает онлайн для меня уже 2,5 года. Просто хватайте постоянно обновляемый контент.

+0

Я смотрел на отслеживание Pid-х. Я также в настоящее время храню время начала, поэтому, если он работает для вас, я дам ему попробовать, спасибо! – ed209

1

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

0

Если у вас есть доступ к командной строке для запуска скриптов из оболочки, я буду склонен писать сценарий, как описано в How feasible is a daemon written in PHP, using ignore_user abort and set_time_limit(0), - и к сообщению в блоге, которое ссылается на. В этом ответе я описываю длинный PHP-скрипт, который обрабатывает данные. Если/когда он выйдет, скрипт bash, который завернут, перезапустит его, чтобы завершить свою работу.

Когда PHP скрипт решил, что он сделал все его работы в течение дня, он вычисляет, сколько секунд до этого нужно снова запустить, а затем просто вызывает sleep($howLongToWaitTillRunAgain);

0

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

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

Если вы чувствуете себя очень авантюрно, вы даже можете заставить Fat Controller запускать несколько экземпляров сценария параллельно, если очередь действительно заполнена, но это не то, что вы хотите в своем случае.

www.4pmp.com/fatcontroller/

Смежные вопросы