当前位置: 首页> 最新文章列表> 如何把 socket_accept() 服务注册为 Linux 后台守护进程

如何把 socket_accept() 服务注册为 Linux 后台守护进程

M66 2025-05-28

在使用 PHP 进行网络编程时,socket_accept() 是一种常见的方式来处理套接字连接。然而,它本身并不会作为守护进程自动持续运行,必须通过额外配置才能在 Linux 中以后台进程的形式稳定执行。本文将介绍如何将包含 socket_accept() 的 PHP 脚本注册为 Linux 后台守护进程,确保其持续运行、自动重启、并具有良好的日志管理能力。

一、准备你的 PHP socket 服务脚本

首先,你需要一个基本的 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

使用 systemd 注册守护进程

  1. 保存 PHP 脚本
    假设你的脚本名为 /usr/local/bin/php_socket_server.php,确保文件可执行:

chmod +x /usr/local/bin/php_socket_server.php
  1. 创建 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
  1. 启用并启动服务

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 或其他反向代理软件,将端口映射至对应服务。例如: