从 Web 界面启动 PHP 守护程序

Start a PHP daemon from a web interface

我正在编写一个 100% PHP 的简单聊天,它使用 WebSocket(没有外部库,就像这个 article)。

显然,这需要一个不断地 运行 PHP 脚本/守护进程/事件循环(类似于 Node.JS 的工作方式),我们从:

php -q websockets.php

nohup ...,或使用专用的Systemd服务(以systemctl start myservice.service开头),或使用service myservice start

问题:假设安装此聊天软件的人无法访问命令行(或对其了解不足),我们如何启动 websockets.php 守护进程直接来自网页,并保持不断 运行?

管理员可以单击他的管理面板中的按钮,然后通过 XHR/AJAX 请求,这将触发服务器端代码 startup.php。在这个 startup.php 中需要什么才能开始并永远保持 websockets.php 运行?

我知道exec,但是在这种情况下是改编的吗?

(更准确地说,假设此管理员没有 command-line/SSH 访问权限,并且只能通过 (S)FTP 上传代码;那么他们只能使用 Web 界面来启动或停止聊天守护程序服务器)

websockets.php 中,我将创建一个条件语句来检查按钮是否被单击(来自数据库的 on/off 设置)。一些伪代码:

// Retrieve $enabled value from the database
if($enabled) {
   $address = '0.0.0.0';
   $port = 12345;

   $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
   // ...
}

// If not enabled just don't do anything.

然后你可以使用supervisord并在/etc/supervisor/conf.d中这样配置:

[program:php-websockets]
command=php -q /home/bob/websockets.php
autostart=true
autorestart=true
user=bob
redirect_stderr=true
stdout_logfile=/home/bob/logs/worker.log

确保在对配置进行任何更改后更新主管。

supervisorctl reread
supervisorctl update

但是,如果您根本无法访问命令行,那么就不可能做到。

他们不太可能成功,因为您可能需要管理员权限才能在 Linux 上启动守护进程。

您必须使用 exec()shell_exec() 来尝试 运行 来自 PHP 的命令。我没有太多这方面的经验,但我认为 php exec command (or similar) to not wait for result 会对你有所帮助,因为很明显你会想开火就忘记了。

您的主要问题是您将无法检测到程序是否失败,或者是否由于任何原因需要重新启动。 (这是假设主机甚至允许您开始执行它)。

底线是,真的,如果您想 运行 自己的流程,请不要使用便宜的共享主机,使用合适的环境。