Я сделал это на недавней работе, но это, вероятно, излишне для вас.Я сделал процессор заданий, и он в основном устанавливает 2 таблицы в базе данных, минимум 2 объекта и минимум 2 контроллера.
Первая часть - это блок обработки задания, он состоит из контроллера обработчика заданий.он управляет запросом на запуск или продолжение работы и поставляется с двумя активными моделями JobQueue и Job.Вы можете удалить очередь, но всегда практично иметь очереди в таких системах, поэтому вы можете сказать, что 2,3,4 задания могут выполняться одновременно.
Очередь только в том, что это слот, который получает несколькоЗадания прикреплены к нему, и он имеет статус очереди, чтобы определить, выполняется ли он прямо сейчас или нет.
Задание - это виртуальный объект, который отображается в таблицу заданий с описанием того, что должно быть сделано.В моей реализации я создал интерфейс, который должен быть реализован в вызываемом контроллере и поле + тип в базе данных.Job создает экземпляр класса контроллера для вызова (не контроллер процессора задания, а другой контроллер, который управляет выполняемой операцией) и вызывает в нем метод для запуска обработки задачи.
Теперь, чтобы запутаться, я вынужденмоя система запускалась на выделенном сервере только для этой части, потому что я не хотел, чтобы задача загружала основной сервер или блокировала очередь обработки Apache.Таким образом, у меня было два сервера, и мой класс Queue отвечал за вызов через ip-адрес страницы на другом сервере, чтобы выполнить задание именно на этом сервере.Когда работа была выполнена, она перезвонила, используя HTTP-запрос, чтобы возобновить обработку и выполнить следующую задачу.Если не было оставлено ни одной задачи, то она просто умерла бы нормально.
Преимущество выполнения этого способа состоит в том, что он не требует cronjob (если ваш сценарий супер стабилен и не может аварийно завершиться), потому что онзапускается вами, когда вы этого хотите, а затем вы можете отпустить его, и он вызывает себя с помощью fsockopen, чтобы вызвать другой просмотр страницы, который запускает следующее задание.
Рабочие единицы
Важно понимать, что если ваши работы очень большие, вы должны их сегментировать.Я использовал принцип «рабочего блока», чтобы описать 1 часть, которую работа должна выполнять любое количество раз.Затем обработчик очередей тоже стал менеджером времени, так что он мог определить, заняло ли задание больше X секунд, он просто отложил бы остальные шаги на потом и перезвонил и продолжил, где бы он ни находился.Таким образом, вам не нужно «устанавливать ограничение по времени», и вы не заклиниваете свой сервер, пока выполняется сценарий 30 с.
Надеюсь, это поможет!