从 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 会对你有所帮助,因为很明显你会想开火就忘记了。
您的主要问题是您将无法检测到程序是否失败,或者是否由于任何原因需要重新启动。 (这是假设主机甚至允许您开始执行它)。
底线是,真的,如果您想 运行 自己的流程,请不要使用便宜的共享主机,使用合适的环境。
我正在编写一个 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 会对你有所帮助,因为很明显你会想开火就忘记了。
您的主要问题是您将无法检测到程序是否失败,或者是否由于任何原因需要重新启动。 (这是假设主机甚至允许您开始执行它)。
底线是,真的,如果您想 运行 自己的流程,请不要使用便宜的共享主机,使用合适的环境。