1

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

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

4

1 回答 1

2

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

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

或者更好的是,为此编写一个Upstart 脚本(如果你在 Debian/Ubuntu 上)。然后它将在系统启动时自动启动,您可以随时通过service script start和轻松将其关闭或重新启动service script stop。您可以通过发出 来检查状态service script status

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

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

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

于 2013-07-14T20:00:18.437 回答