Это фоновый процесс, верно?В этом случае вы не должны запускать его через веб-сервер.Запустите его из командной строки, либо как демон, либо как задание cron.
Я предпочитаю задание "cron", потому что вы автоматически получаете автоматический перезапуск.Убедитесь, что у вас не запущено больше экземпляров программы, чем хотелось бы (это можно сделать, заблокировав файл в файловой системе, сделав что-то атомарное в базе данных и т. Д.).
Тогда вам просто нужно запуститьколичество процессов, которые вы хотите, и чтобы они считывали работу из очереди.
Обычно для этого используется таблица, содержащая столбцы для хранения тех, кто в данный момент выполняет заданную задачу:
CREATE TABLE sometasks (
ID of some kind,
Other info required to do task,
some data we need to know if the task is due yet or complete,
locked_by_host VARCHAR(64) NULL,
locked_by_pid INT NULL
)
Затем процесс выполнит следующий псевдо-запрос, чтобы заблокировать набор задач (размер пакета batch_size может быть равен 1)
UPDATE sometasks SET locked_by_host=my_hostname, locked_by_pid=my_pid
WHERE not_done_already AND locked_by_host IS NULL ORDER BY ID LIMIT batch_size
Затем выбрать строки обратно с помощью выборанайти задачи текущего процесса.Затем обработайте задачи и обновите их как выполненные и снимите блокировку.
Я бы выбрал работу cron с процессом контроллера, который запускает N дочерних процессов и контролирует их.Дочерние процессы могут периодически умирать (помните, что PHP не имеет хорошего GC, поэтому он может легко вытекать из памяти) и перезапускаться для предотвращения утечек ресурсов.
Если работа завершена, родитель может выйти и ждатьбыть повторно вызванным cron (следующий час или что-то в этом роде).
NB: locked_by_host может хранить имя хоста (pids не уникальны на разных хостах) для обеспечения распределенной обработки, но, возможно, вам не нужноэто, так что вы можете опустить его.
Вы можете сделать этот дизайн более надежным, поместив столбец locked_time и определив, когда задача занимает слишком много времени - вы можете предупредить, убить процесс и попробовать еще раз или что-то еще.