PHP服务(守护进程)

时间:2013-07-14 19:45:38

标签: php service daemon

我有一个网站,通过REST API提供某种服务。所有功能都有常规的HTTP请求 - 响应逻辑。但另外我需要另一个PHP脚本来做一些连续的事情。一方面,该脚本应该可以访问所有核心服务功能(核心引擎,存储过程等)。另一方面,此脚本应保持与第三方服务的持久连接,并不时从中读取一些信息。此外,此脚本应该是容错的,并且应该保证此脚本的任何一个实例都可以随时运行。还有一些原因导致我无法将此任务放在Cron服务上而不是运行无限脚本。

我现在最好的想法是编写以set_time_limit(0)开头的常规PHP脚本,并包含无限循环和我的东西动作并在它之后休眠。此脚本将手动启动。此外,我可以使用某种密码保护此脚本,以确保没有其他人可以运行它。你们对这个解决方案有什么看法?这样的解决方案会不会影响一些不需要的FastCGI副作用?如何使此解决方案容错?如何停止此脚本,或检查它是否正在运行?最后一件事:如何通过HTTP请求运行此脚本,以便它不会阻止任何事情(有点背景运行CURL或其他东西)。谢谢!

1 个答案:

答案 0 :(得分:2)

首先,为什么不能使用crond呢?

我建议您每隔15分钟通过crond启动一次脚本。这样,如果脚本崩溃,该脚本将最多15分钟不可用。为了确保脚本只运行一次,您实现了所有其他守护进程所做的事情 - 一个PID文件 - 为此使用posix_getpid()。如果存在具有该PID的进程,则终止该脚本。如果没有,则先前的实例崩溃,脚本应该再次运行。

或者甚至更好,为此写一个Upstart script(如果你在Debian / Ubuntu上)。它会在系统启动时自动启动,您可以随时通过service script startservice script stop将其关闭或重新启动。您可以发出service script status

来查看状态

您将脚本放在任何htdocs目录之外的服务器上。这样它就不会暴露给Web,也无法通过HTTP请求启动。您还可以使用php_sapi_name()检查SAPI为cli

为什么要通过HTTP运行该脚本?它是一个守护进程,所以它从系统启动开始。

您还应该查看类似的问题:Run php script as daemon process