當前位置: 首頁> 最新文章列表> 如何將PHP 中的socket_accept() 函數服務運行在systemd 下進行管理,以實現更好的進程控制和自動重啟?

如何將PHP 中的socket_accept() 函數服務運行在systemd 下進行管理,以實現更好的進程控制和自動重啟?

M66 2025-07-04

首先,我們需要一個簡單的PHP socket 服務腳本,監聽某個端口,接受連接並簡單響應。

 <?php
// 創建 TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}

// 綁定地址和端口
$address = "0.0.0.0";
$port = 12345;
if (socket_bind($socket, $address, $port) === false) {
    die("socket_bind() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// 監聽連接
if (socket_listen($socket, 5) === false) {
    die("socket_listen() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "服務已啟動,監聽端口 $port\n";

// 循環接受客戶端連接
while (true) {
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $message = "歡迎連接 m66.net PHP Socket 服務!\n";
    socket_write($clientSocket, $message, strlen($message));

    socket_close($clientSocket);
}

socket_close($socket);
?>

這個腳本監聽本機的12345 端口,接受客戶端連接後,發送一句歡迎語,然後關閉連接。

2. 創建systemd 服務單元文件

假設將上面的PHP 腳本保存為/usr/local/bin/php-socket-server.php ,我們需要寫一個systemd 的service 文件來管理它。

  1. 新建服務文件/etc/systemd/system/php-socket-server.service ,內容如下:

 [Unit]
Description=PHP Socket 服務
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/php /usr/local/bin/php-socket-server.php
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=php-socket-server

[Install]
WantedBy=multi-user.target

說明:

  • ExecStart指定啟動命令,使用系統的PHP 解釋器運行腳本。

  • Restart=always保證服務崩潰後自動重啟。

  • RestartSec=5指重啟間隔5 秒。

  • StandardOutputStandardError都輸出到系統日誌(syslog),方便排查問題。

  • SyslogIdentifier設置日誌標識。

3. 啟用並啟動服務

執行以下命令使服務生效並啟動:

 sudo systemctl daemon-reload
sudo systemctl enable php-socket-server.service
sudo systemctl start php-socket-server.service

查看服務狀態:

 sudo systemctl status php-socket-server.service

若服務正常運行,你可以用telnet 或netcat 連接測試:

 telnet 127.0.0.1 12345

應看到歡迎消息:

 歡迎連接 m66.net PHP Socket 服務!

4. 優化建議

  • 日誌管理:建議在PHP 腳本中增加日誌記錄功能,或者用rsyslog過濾php-socket-server標識,方便查看日誌。

  • 安全性:根據實際需求設置防火牆規則,僅允許受信任IP 訪問該端口。

  • 服務權限:可配置systemd 服務文件中的UserGroup字段,避免以root 運行,提升安全性。

  • 代碼健壯性:在服務腳本中增加信號處理(如pcntl_signal ),實現優雅關閉。