在使用 PHP 进行网络编程时,socket_accept() 是一种常见的方式来处理套接字连接。然而,它本身并不会作为守护进程自动持续运行,必须通过额外配置才能在 Linux 中以后台进程的形式稳定执行。本文将介绍如何将包含 socket_accept() 的 PHP 脚本注册为 Linux 后台守护进程,确保其持续运行、自动重启、并具有良好的日志管理能力。
首先,你需要一个基本的 socket 服务端脚本。以下是一个简单的 TCP 服务端的 PHP 示例:
<?php
$host = '0.0.0.0';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Server started on {$host}:{$port}\n";
while (true) {
$client = @socket_accept($socket);
if ($client === false) {
usleep(100000); // 避免CPU占用过高
continue;
}
$message = "Hello from server at m66.net\n";
socket_write($client, $message, strlen($message));
socket_close($client);
}
socket_close($socket);
要将其转为守护进程运行,你需要手动“脱离终端”。一种常用方式是使用 PHP 实现守护进程模式,或者更常见的是配合 Linux 的 systemd。
保存 PHP 脚本
假设你的脚本名为 /usr/local/bin/php_socket_server.php,确保文件可执行:
chmod +x /usr/local/bin/php_socket_server.php
创建 systemd 服务单元文件
在 /etc/systemd/system/php-socket.service 中添加如下内容:
[Unit]
Description=PHP Socket Server
After=network.target
[Service]
ExecStart=/usr/bin/php /usr/local/bin/php_socket_server.php
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=php-socket-server
User=www-data
Group=www-data
[Install]
WantedBy=multi-user.target
启用并启动服务
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable php-socket.service
sudo systemctl start php-socket.service
这样,你的 socket 服务将在系统启动时自动运行,并在异常退出时自动重启。
你可以使用以下命令检查服务状态:
sudo systemctl status php-socket.service
查看日志信息:
journalctl -u php-socket.service -f
在长时间运行的后台 socket 服务中,合理的异常处理非常关键。建议对 socket_accept 返回 false 的情况做适当延时,并监控日志是否有频繁的错误。
如果你希望通过域名如 m66.net 对外提供服务,可以结合 Nginx 或其他反向代理软件,将端口映射至对应服务。例如: