ReactPHP:使用启动/停止命令运行服务器

时间:2021-04-04 20:08:59

标签: php linux cron centos reactphp

我正在用 ReactPHP 创建一个套接字服务器,我需要它永远运行。 我还有一个命令面板,我必须在其中检查进程是否正在运行,我可以停止或启动它(或重新启动它)。

我不知道如何实现这一点。

我的计划是:

  • 使用播放按钮:使用简单的“php script.php”启动 php 命令 shell_exec。
  • 使用停止按钮,我可以通过两种方式进行操作: 1. 我可以在循环中设置一个计时器,每 5 秒检查一次文件夹中是否有文件(如“stop.lock”),然后停止该过程。 2.我可以将进程PID保存在数据库中,因此单击停止按钮我可以终止进程。
  • 检查在线状态:我可以制作另一个脚本来尝试连接到 IP/端口,如果成功则为在线,否则(超时 5 秒)为离线。

我还希望脚本始终处于侦听状态,那么如果例如我必须重新启动服务器,我该如何使脚本自动启动? 我正在考虑每分钟尝试连接到服务器的 cron;如果失败,它会再次启动 shell_exec('php script.php');

处理所有问题的最佳解决方案是什么? (服务器操作系统为 CentOS 7)

2 个答案:

答案 0 :(得分:0)

正如@Volker 所说,如果您想优雅地停止循环,只需停止循环即可。您可以定期检查文件或查询表,但这不是一个好方法。

一个不错的流程可能是收听管理消息以停止服务器。当然,您应该关心验证谁可以停止服务器。通过这种方式,它无需等待一段间隔即可停止运行,并且您可以减少定期查询文件系统或数据库的开销。

另一种很酷的方法是使用 RabbitMQ 或类似的队列服务。您只需监听您的队列服务器,然后您就可以从您的脚本向 RabbitMQ 发送消息,然后从那里发送到您的服务器。

祝你好运!

编辑:如果您使用 systemd 运行您的服务器,一个很好的处理方式可能就是监听系统信号以优雅地停止应用程序。看看addSignal,可以通过pid处理kill,也可以通过systemd。

答案 1 :(得分:0)

为了处理正常关闭与长时间运行的流响应,我创建了一个类似获取/释放的机制。

当处理程序开始流式传输长响应时,它会获取一个锁,并在流式传输完成后释放它(它只是一个 uniqid() 数组)。

如果有活动锁,服务器可以决定等待。

我使用主管通过 SIGTERM 信号处理启动/停止。