让PHP脚本永远运行,访问队列

时间:2010-09-21 13:05:46

标签: php amazon-sqs

另请参阅Having a PHP script loop forever doing computing jobs from a queue system,但这并不能回答我的所有问题。

如果我想永远运行PHP脚本,访问队列并完成工作:

  1. 内存问题的可能性有多大?如何避免它们? (任何冲洗功能或我应该使用的东西?)

  2. 如果脚本因某种原因死亡怎么办?什么是自动启动它的好方法?

  3. 启动脚本的最佳基本方法是什么。由于它永远运行,我不需要cron。但是我该如何启动呢? (另见2.)

3 个答案:

答案 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'参数运行第二个)