首先,我們需要一個簡單的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 端口,接受客戶端連接後,發送一句歡迎語,然後關閉連接。
假設將上面的PHP 腳本保存為/usr/local/bin/php-socket-server.php ,我們需要寫一個systemd 的service 文件來管理它。
新建服務文件/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 秒。
StandardOutput和StandardError都輸出到系統日誌(syslog),方便排查問題。
SyslogIdentifier設置日誌標識。
執行以下命令使服務生效並啟動:
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 服務!
日誌管理:建議在PHP 腳本中增加日誌記錄功能,或者用rsyslog過濾php-socket-server標識,方便查看日誌。
安全性:根據實際需求設置防火牆規則,僅允許受信任IP 訪問該端口。
服務權限:可配置systemd 服務文件中的User和Group字段,避免以root 運行,提升安全性。
代碼健壯性:在服務腳本中增加信號處理(如pcntl_signal ),實現優雅關閉。