當前位置: 首頁> 最新文章列表> 如何在PHP CLI 模式下使用socket_accept() 構建服務

如何在PHP CLI 模式下使用socket_accept() 構建服務

M66 2025-05-18

在PHP 的CLI(命令行接口)模式下, socket_accept()函數可以用來處理低層的網絡連接。這使得我們可以使用PHP 構建簡單的TCP 服務器,用於接受客戶端請求和發送響應。雖然PHP 並不是傳統意義上構建網絡服務的首選語言,但它提供了足夠的底層API,讓我們可以輕鬆實驗或構建輕量級服務。

基本概念

在建立一個網絡服務之前,需要了解以下幾個PHP 的Socket 函數:

示例:構建一個簡單的TCP 服務器

以下是一個使用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 系統的數據交換(如硬件設備)