我正在开发一个网站,需要大量后台流程才能运行该网站。例如,队列,视频编码器和一些其他类型的后台进程。目前我将这些作为PHP cli脚本运行,其中包含:
while (true) {
// some code
sleep($someAmountOfSeconds);
}
好的,这些工作正常,但我想把它们设置为一个deamon,它会给我们一个我可以监控的实际进程ID,我也可以在后台运行它们而不是一直打开终端
我想知道是否有更好的处理方法?我也在考虑cron作业,但其中一些过程需要每隔几秒循环一次。
有什么建议吗?
答案 0 :(得分:2)
创建一个可以调用并提出问题的守护进程似乎是明智的选择。取决于你的主机允许这样的事情,特别是如果你要求它每隔几秒钟做一次工作,那么肯定一个基于操作系统的服务/守护进程似乎比其他任何东西都更明智。
答案 1 :(得分:1)
你可以在PHP中创建一个守护进程,但根据我的经验,这是一项艰苦的工作,由于PHP的内存管理和错误处理,结果是不可靠的。
我遇到了同样的问题,我想在PHP中编写我的逻辑,但是如果它失败了那么可以重新启动PHP脚本的稳定程序将其保存,因此我写了The Fat Controller。
它是用C语言编写的,作为守护进程运行,可以运行PHP脚本,甚至可以运行任何东西。如果PHP脚本因任何原因而结束,Fat Controller将重新启动它。这意味着您不必处理守护程序或错误恢复 - 这些都是为您处理的。
胖控制器还可以执行许多其他操作,例如并行处理,这是队列处理的理想选择,您可以在这里阅读一些潜在的用例:
答案 2 :(得分:1)
我用PHP运行后台任务已经做了5年,与其他任何语言都没有什么不同。只需使用CRON并锁定文件。锁定文件将阻止脚本的多个实例运行。
同样重要的是监控你的代码和一次检查我总是做的是防止过时的锁文件阻止脚本运行是有第二个CRON作业来检查锁文件是否超过几分钟,如果一个实例PHP脚本正在运行,如果没有,则删除锁定文件。
使用此技术,您可以将CRON设置为每分钟运行一次脚本而不会出现问题。
答案 3 :(得分:0)
使用PEAR中的System::Daemon模块。
答案 4 :(得分:0)
一个解决方案(我真的需要尝试自己,因为我可能需要它)是使用cron,但让循环过程持续5分钟左右。然后,让cron每五分钟开始一次。当一个人去世时,下一个应该完成(或接近完成)。
请记住,两者可能会重叠一点,因此您需要确保这不会导致冲突(例如写入同一视频文件)。一些简单的进程间通信可能很有用,即使它只是写入临时目录中的PID文件。
这种方法技术有点低,但有助于避免PHP在较长时间内挂在内存上 - 有点内置的任务重启!