PHP服务(守护进程)

PHP服务(守护进程),php,service,daemon,Php,Service,Daemon,我有一个通过RESTAPI提供某种服务的网站。所有功能都有常规的HTTP请求-响应逻辑。但另外,我需要另一个PHP脚本,它可以做一些连续的事情。一方面,该脚本应该可以访问所有核心服务功能(核心引擎、存储过程等)。另一方面,此脚本应保持与第三方服务的持久连接,并不时从中读取一些信息。此外,该脚本应该是容错的,并且应该保证在任何时候都只运行该脚本的一个实例。还有一些原因使我不能将此任务放在Cron服务上,而不是无限脚本运行 目前我最好的想法是编写以set_time_limit(0)开头的常规PHP脚

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


目前我最好的想法是编写以set_time_limit(0)开头的常规PHP脚本,它包含无限循环,其中包含我的stuff操作和之后的sleep。此脚本将手动启动。此外,我可以用某种密码保护这个脚本,以确保没有其他人可以运行它。你们觉得这个解决方案怎么样?这样的解决方案不会影响一些不必要的FastCGI副作用吗?如何使此解决方案具有容错性?我如何停止这个脚本,或者检查它是否正在运行?最后一件事:我如何通过HTTP请求运行这个脚本,这样它就不会阻塞任何东西(有点像后台运行CURL之类的东西)。谢谢

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

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

或者更好的方法是,为此编写一个示例(如果您使用的是Debian/Ubuntu)。然后,它将在系统启动时自动启动,您可以随时通过
服务脚本启动
服务脚本停止
将其关闭或重新启动。您可以通过发出
服务脚本status
来检查状态

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

为什么要通过HTTP运行该脚本?它是一个守护进程,因此在系统启动时启动


您还应该看一个类似的问题:。

我需要保持与第三方服务的持久连接,并且由于我无法在脚本实例之间传递连接的套接字,所以唯一的方法是使用连续脚本而不是Cron。我需要保持连接的持久性,因为我需要最大限度地减少对第三方服务的请求之间的延迟。如果我使用Cron,那么DNS解析和TCP连接将有额外的延迟。即使DNS将被缓存,我也不能消除TCP连接延迟。我的服务器是CentOS服务器。它会影响你的建议吗?脚本实际上是持久的。Crond只是用来启动脚本并在脚本崩溃时重新启动它(您使用的术语是“容错”)。在脚本中,你仍然有一些“无休止的循环”。是的,CentOS也使用Upstart。在考虑了您编写的所有内容之后,我想我会尝试制作Upstart脚本和看门狗Cron任务。谢谢你的帮助,伙计!:)