在PHP 的CLI(命令行接口)模式下, socket_accept()函數可以用來處理低層的網絡連接。這使得我們可以使用PHP 構建簡單的TCP 服務器,用於接受客戶端請求和發送響應。雖然PHP 並不是傳統意義上構建網絡服務的首選語言,但它提供了足夠的底層API,讓我們可以輕鬆實驗或構建輕量級服務。
在建立一個網絡服務之前,需要了解以下幾個PHP 的Socket 函數:
socket_create() :創建一個套接字資源。
socket_bind() :將套接字綁定到IP 地址和端口上。
socket_listen() :監聽傳入的連接。
socket_accept() :接受連接請求。
socket_read() / socket_write() :用於接收和發送數據。
socket_close() :關閉連接。
以下是一個使用socket_accept()構建的簡單PHP TCP 服務器示例。
<?php
$host = "0.0.0.0";
$port = 9000;
// 創建套接字
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}
// 綁定到地址和端口
if (!socket_bind($sock, $host, $port)) {
die("socket_bind() failed: " . socket_strerror(socket_last_error($sock)) . "\n");
}
// 開始監聽
if (!socket_listen($sock, 5)) {
die("socket_listen() failed: " . socket_strerror(socket_last_error($sock)) . "\n");
}
echo "服務器已啟動,監聽端口 $port...\n";
while (true) {
// 接受一個連接
$client = socket_accept($sock);
if ($client === false) {
echo "socket_accept() failed: " . socket_strerror(socket_last_error($sock)) . "\n";
continue;
}
// 讀取客戶端請求
$input = socket_read($client, 1024);
echo "收到請求:" . trim($input) . "\n";
// 構造響應內容
$response = "歡迎訪問 m66.net 的測試服務!你發送的是:$input\n";
// 寫回客戶端
socket_write($client, $response, strlen($response));
// 關閉客戶端連接
socket_close($client);
}
// 關閉主套接字(理論上永遠不會執行到這裡)
socket_close($sock);
將以上代碼保存為server.php ,然後通過命令行運行:
php server.php
此腳本會監聽9000端口,等待客戶端連接。你可以使用telnet或其他TCP 客戶端工具連接該服務器:
telnet 127.0.0.1 9000
輸入任意文本並回車後,服務器會將該文本回顯,並帶有一條歡迎信息。
請確保PHP 已啟用sockets擴展(可通過php -m檢查)。
該服務是單線程的,每次只能處理一個連接。如果需要並發處理多個連接,可以藉助pcntl_fork()或使用更專業的服務如Swoole。
請勿在生產環境中使用此類簡易實現,因為它沒有任何安全性與容錯處理。
雖然PHP 不是網絡服務開發的主力語言,但這類套接字服務可以用於:
簡易的調試工具
局域網數據收發服務
自定義協議的原型開發
與非Web 系統的數據交換(如硬件設備)