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

PHP Socket 實現 HTTP GET/POST 請求底層通訊詳解

     編輯:PHP 綜合知識

為什麼用 Socket?

  • 理解 HTTP 協議底層細節
  • 環境禁用 allow_url_fopen、無 cURL 擴展時的備選
  • 特殊協議交互(如原始 TCP 服務、自定義頭部)

GET 請求實現

<?php
function socketGet($url, &$ret) {
    $urlArr = parse_url($url);
    $host = $urlArr['host'];
    $port = isset($urlArr['port']) ? $urlArr['port'] : 80;
    $path = isset($urlArr['path']) ? $urlArr['path'] : "/";

    $fp = fsockopen($host, $port, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
        return false;
    }

    $out = "GET $path HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";

    $ret = "";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $ret .= fgets($fp, 128);
    }
    fclose($fp);
    return true;
}

// 使用
$html = '';
socketGet('https://www.example.com/', $html);
echo $html;
?>

POST 請求實現

<?php
function socketPost($url, $data, &$ret) {
    $urlArr = parse_url($url);
    $host = $urlArr['host'];
    $port = isset($urlArr['port']) ? $urlArr['port'] : 80;
    $path = isset($urlArr['path']) ? $urlArr['path'] : "/";

    $fp = fsockopen($host, $port, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
        return false;
    }

    $out = "POST $path HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $out .= "Content-Length: " . strlen($data) . "\r\n";
    $out .= "Connection: Close\r\n\r\n"; // 若 Keep-Alive 導致掛起,改為 Close
    $out .= $data;

    $ret = "";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $ret .= fgets($fp, 128);
    }
    fclose($fp);
    return true;
}

// 使用
$postData = "username=test&password=123456";
$response = '';
socketPost('https://www.example.com/login.php', $postData, $response);
echo $response;
?>

關鍵點解析

項目GETPOST
請求行GET /path HTTP/1.1POST /path HTTP/1.1
Host 頭必須(HTTP/1.1 強制)必須
Content-Type無application/x-www-form-urlencoded
Content-Length無Body 字節長度
ConnectionClose(簡單斷開)Close(避免 Keep-Alive 讀取掛起)
Body無URL 編碼的鍵值對字符串

響應處理建議

  • 返回內容包含 頭部 + 體,需按 \r\n\r\n 分離
  • 頭部解析:HTTP/1.1 200 OK、Content-Type、Content-Length、Set-Cookie 等
  • 分塊傳輸(Transfer-Encoding: chunked)需手動解碼塊大小
  • HTTPS 需用 fsockopen('ssl://host', 443) 或 stream_socket_client + SSL 上下文

生產環境建議

除非極特殊場景,優先使用 cURL 或 Guzzle:支持重試、超時控制、並發、Cookie 管理、代理、HTTP/2、證書驗證等企業級特性。Socket 手寫僅作教學或極簡環境應急。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved