另请参阅Having a PHP script loop forever doing computing jobs from a queue system,但这并不能回答我的所有问题。
如果我想永远运行PHP脚本,访问队列并完成工作:
内存问题的可能性有多大?如何避免它们? (任何冲洗功能或我应该使用的东西?)
如果脚本因某种原因死亡怎么办?什么是自动启动它的好方法?
启动脚本的最佳基本方法是什么。由于它永远运行,我不需要cron。但是我该如何启动呢? (另见2.)
答案 0 :(得分:9)
将队列设置为cron脚本。让它每10秒执行一次。当脚本启动时,检查是否存在锁定文件(类似.lock)。如果有,立即退出。如果没有,请创建.lock并开始处理。如果发生任何错误,请发送电子邮件/记录这些错误,删除.lock并退出。如果没有任务,则退出。
我认为这种方法是理想的,因为PHP并不是真的能够像你要求的那样长时间运行脚本。为了避免潜在的内存泄漏,崩溃等问题,不断执行脚本是一种更好的方法。
答案 1 :(得分:1)
虽然PHP可以访问(发布和使用)MQ,但如果可能的话,尝试使用功能齐全的MQ应用程序来执行此操作。
一个功能齐全的MQ应用程序(在ruby,perl,.NET,java等中)将处理您讨论的所有并发,错误日志记录,状态管理和可伸缩性问题。
答案 2 :(得分:0)
状态机不要太过分,至少将状态引入“工作”(例如:flv2avi转换)和'任务'(flv2avi 1.flv)是个好主意。
在我的脚本(Perl)上,有时僵尸进程开始降级整个脚本的性能。这是一种罕见的情况,但它在源代码中是原生的,因此脚本应该能够停止读取队列,允许新实例继续其任务和工作;但是,保持尽可能多的运行任务数据是受欢迎的。一旦第一个实例有1-2个任务,它就会被杀死。
开始时: 检查常见错误(由于关闭) 检查已知错误(空间不足,无法读取输入) 杀死任何可能被杀死的东西并将状态设置为“等待” 开始等待。
如果您运行管道作业(vlc | ffmpeg,tail -f | grep),您可以尝试避免在程序中使用过多的I / O,而不是使用fork()(对PHP来说是个坏主意?)或者只是调用/ bin / bash -c“prog1 | prog2”,这可以节省大量的CPU负载。
起点:/etc/rc.d和cron(检查进程,运行第一个实例||使用'debug'参数运行第二个)