首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Socket 編程入門:從基礎配置到 TCP/UDP 實戰與安全應用

     編輯:PHP 相關知識

為什麼學習 PHP Socket

PHP 不僅是 Web 腳本語言,其 Socket 擴展能實現端口轉發、掃描器、後門檢測、自定義協議服務器等系統級功能,突破傳統請求-響應模型限制。

環境啟用

  • Windows:php.ini 取消註釋 extension=sockets,確保 php_sockets.dll 存在
  • Linux/macOS:編譯時加入 --enable-sockets,或安裝 php-sockets 包
  • CLI 執行:php -q script.php(-q 抑制 HTTP Header 輸出)

核心函數速查

函數用途
socket_create()建立 Socket 資源
socket_bind()綁定 IP:Port
socket_listen()監聽連接
socket_accept()接受客戶端連接
socket_connect()發起連接
socket_read/write()讀寫數據
socket_close()關閉連接
socket_set_option()設置選項(超時、非阻塞等)

實戰一:TCP Echo 服務器

<?php
// server.php
$host = '0.0.0.0'; $port = 9501;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sock, $host, $port);
socket_listen($sock, 5);
echo "Server listening on {$host}:{$port}\n";

while (true) {
    $client = socket_accept($sock);
    $input = socket_read($client, 1024);
    $msg = trim($input);
    echo "Received: {$msg}\n";
    socket_write($client, "Echo: {$msg}\n");
    socket_close($client);
}
socket_close($sock);

實戰二:TCP 客戶端

<?php
// client.php
$host = '127.0.0.1'; $port = 9501;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, $host, $port);
socket_write($sock, "Hello PHP Socket!\n");
$response = socket_read($sock, 1024);
echo "Server reply: {$response}\n";
socket_close($sock);

實戰三:UDP 廣播發現服務

<?php
// udp_server.php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock, '0.0.0.0', 9502);
while (true) {
    $from = ''; $port = 0;
    socket_recvfrom($sock, $buf, 512, 0, $from, $port);
    echo "From {$from}:{$port} => {$buf}\n";
    socket_sendto($sock, "OK: {$buf}", strlen($buf), 0, $from, $port);
}

命令行參數處理

<?php
// scan.php 端口掃描器示例
if ($argc < 3 || in_array($argv[1], ['-h', '--help', '?'])) {
    echo "Usage: php scan.php   \n";
    exit(1);
}
[$host, $start, $end] = [$argv[1], (int)$argv[2], (int)$argv[3]];
for ($port = $start; $port <= $end; $port++) {
    $sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    @socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 0, 'usec' => 500000]);
    $result = @socket_connect($sock, $host, $port);
    if ($result) {
        echo "Port {$port} OPEN\n";
        socket_close($sock);
    }
}

安全警示與合規

  • 端口掃描、後門、Exp 框架屬於攻擊工具,**僅授權測試環境使用**
  • 生產環境嚴禁開放任意 Socket 監聽,防止成為跳板
  • 使用 stream_socket_server() 等高層封裝可簡化錯誤處理

進階學習路線

  1. I/O 多路複用:socket_select()、stream_select()
  2. 異步非阻塞:ReactPHP、Swoole、AMP 事件循環框架
  3. 原始 Socket:socket_create(AF_INET, SOCK_RAW, ...) 需 Root 權限
  4. 協議實現:HTTP、WebSocket、DNS、自定義二進制協議
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved