當前位置: 首頁> 最新文章列表> 如何把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 腳本<br> 假設你的腳本名為/usr/local/bin/php_socket_server.ph p ,確保文件可執行

chmod +x /usr/local/bin/php_socket_server.php
  1. 創建systemd 服務單元文件<br>在/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 或其他反向代理軟件,將端口映射至對應服務。例如: