另请参阅让 PHP 脚本循环永远从队列系统执行计算作业,但这并不能回答我的所有问题。
如果我想永远运行 PHP 脚本,访问队列并做作业:
内存问题的可能性是什么?如何避免它们?(任何冲洗功能或我应该使用的东西?)
如果脚本由于某种原因死了怎么办?什么是自动重新启动它的好方法?
启动脚本的最佳基本方法是什么。由于它永远运行,我不需要 cron。但是我该如何启动它呢?(另见 2。)
另请参阅让 PHP 脚本循环永远从队列系统执行计算作业,但这并不能回答我的所有问题。
如果我想永远运行 PHP 脚本,访问队列并做作业:
内存问题的可能性是什么?如何避免它们?(任何冲洗功能或我应该使用的东西?)
如果脚本由于某种原因死了怎么办?什么是自动重新启动它的好方法?
启动脚本的最佳基本方法是什么。由于它永远运行,我不需要 cron。但是我该如何启动它呢?(另见 2。)
将队列设置为 cron 脚本。让它每 10 秒执行一次。当脚本启动时,检查是否存在锁定文件(类似于 .lock)。如果有,立即退出。如果没有,请创建 .lock 并开始处理。如果发生任何错误,请通过电子邮件发送/记录这些错误,删除 .lock 并退出。如果没有任务,则退出。
我认为这种方法是理想的,因为 PHP 并不是真正设计为能够像您要求的那样长时间运行脚本。为了避免潜在的内存泄漏、崩溃等,连续执行脚本是一种更好的方法。
虽然 PHP 可以访问(发布和使用)MQ,但如果可能,请尝试使用功能齐全的 MQ 应用程序来执行此操作。
一个功能齐全的 MQ 应用程序(在 ruby、perl、.NET、java 等中)将处理您讨论的所有并发、错误记录、状态管理和可伸缩性问题。
状态机不要走得太远,至少将状态引入“作业”(例如: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' 参数运行第二个实例)