以下是我对守护进程的要求:
- 持续检查MySQL数据库表中是否已添加行
- 对从数据库检索到的内容运行FFmpeg命令
- 将输出插入到MySQL表中
使用PHP会有多大的性能差异呢?请原谅我的无知,我正在学习中! :)
感谢各位。
正如其他人所指出的,PHP的不同版本存在垃圾收集器问题。如果您知道您的版本没有这样的问题,那么您就可以消除这个问题。关键是,在编写守护程序并通过valgrind运行它以查看安装的PHP是否在任何给定的机器上泄漏之前,您不能(确定地)知道。因此,在这方面,您可能编写它只是为了发现Zend认为已经修复的问题仍然存在漏洞,或者您正在处理略旧的PHP版本或某些扩展。让人不爽。
另一个问题是有点毛病的信号。根据我的经验,使用PHP时信号处理程序并不总是正确进入,特别是当信号排队而非合并时。这对您可能不是个问题,例如,如果您只需要处理SIGINT / SIGUSR1 / SIGUSR2 / SIGHUP。
因此,我建议:
如果守护程序很简单,请继续使用PHP。如果它看起来会变得相当复杂,或者分配大量内存,您可能需要在用PHP原型设计后再用C编写它。
我是一个非常热衷于C的人。但是,我认为使用PHP快速解决某些问题也没有问题(除了我解释的情况之外)。我也认为,使用PHP原型设计可能会在以后重写成C时更好。例如,如果您使用PHP处理数据库事务,将比使用其他C接口管理回调函数要简单得多。因此,在这种情况下,对于“一次性”的任务,您肯定可以更快地完成它。
我倾向于使用cron job来执行此任务,而不是在守护进程中轮询数据库。
你的FFmpeg命令可能需要一段时间才能完成,对吧?如果是这样,那么频繁地轮询数据库是否真的有必要呢?每分钟运行一次cronjob(或者每五分钟、十分钟或二十分钟等)是否更简单地实现了相同的功能呢?
对于这种类型的工作,Php并不比其他常见的脚本语言更好或更差。它可以很好地访问所有系统调用和库实用程序,以完成此类工作。如果您最熟悉使用PHP进行脚本编写,则php可以胜任该工作。
唯一的缺点是,与Perl或Python等语言相比,Php并不像它们那样普及,只能在用于提供动态Web内容的系统上找到。并不是说安装Php解释器太大或太昂贵,但如果您最关心的是使程序运行在多个系统上,那可能会有一些障碍。
在正确地将PHP脚本转化为守护进程的过程中,一个问题是PHP没有dup()或dup2()系统调用的接口,而这些调用是分离文件描述符所必需的。
通过合理确定的周期性作为cron作业运行,PHP脚本可以完成任务,并且生产稳定性肯定是可实现的。您可能希望限制同时运行的FFMpeg实例数量,并确保具有完整的应用程序日志记录和异常处理。我已经在Java中实现了持续运行的轮询进程,以及每十分钟运行一次的cron PHP脚本,两者都可以很好地完成工作。
System_Daemon
,我最近在PHP v5.3.0安装中成功使用了它。作者的博客上有文档:http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php
如果您已经安装了PEAR,可以使用以下命令安装此模块:pear install -f System_Daemon
您还需要创建一个初始化脚本:/etc/init.d/<your_daemon_name>
然后您可以执行以下操作:
/etc/init.d/projNotifMailDaemon start
/etc/init.d/projNotifMailDaemon stop
日志保存在:/var/log/<your_daemon_name>.log
如果你结合Kent Fredric、tokenmacguy和Domster的答案,你会得到一些有用的东西。
php可能不适合长时间执行,所以让我们保持每个执行周期短,并确保操作系统处理任何内存泄漏的清理工作。作为启动php脚本的工具,cron可以是一个好工具。如果你这样做,各种语言之间没有太大的区别。
然而,问题仍然存在。php是否能够作为正常守护进程运行很长时间(几年)?或者各种内存泄漏会耗尽所有的内存并杀死系统?
/ Johan