这是后台进程,对不对?在这种情况下,您不应该通过Web服务器运行它。从命令行运行它,无论是作为守护进程还是作为cron作业。
我的首选项是“cron”作业,因为您可以自由重启。确保你没有更多的程序正在运行的实例(你可以通过在文件系统中锁定一个文件,在数据库中做一些原子操作来达到这个目的)。
然后你只需要开始你想要的进程数,并让它们从队列中读取工作。
通常情况下这样做是有包含列来存储谁是目前excuting一个给定的任务表中的模式:
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
)
然后,该过程将执行以下操作pseduo查询锁定一组任务(是的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
然后选择行背出使用中可以找到当前进程的任务。然后处理这些任务,并将它们更新为“完成”并清除锁定。
我会选择与启动n个子流程和监控他们一个控制器进程cron作业。子进程可以定期死亡(记得PHP没有好的GC,所以它可以很容易泄漏内存),并可以重生,以防止资源泄漏。
如果工作全部完成,家长可能会退出,并等待由cron(接下来的一个小时或东西)来重生。
NB:locked_by_host可存储的主机名(PID不是在不同的主机是唯一的),允许分布式处理,但也许你并不需要的是,这样你就可以忽略它。
您可以通过把一个locked_time列,当一个任务已花费的时间太长检测这样的设计更强大的 - 你可以提醒,杀进程,并重试,或什么的。