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

PHP 實作 HTTP Chunked 編碼解碼器

     編輯:PHP 綜合知識

Chunked 傳輸編碼格式

HTTP Response 標頭含 Transfer-Encoding: chunked 時,Body 由多個 Chunk 組成:

Chunked-Body = *chunk
"0" CRLF
footer
CRLF

chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLF

chunk-size = hex-no-zero *HEX  (十六進位長度,不含前導 0)

解碼流程(RFC 標準)

  1. 讀取 chunk-size 與 CRLF
  2. 若 chunk-size > 0:讀取指定長度的 chunk-data 及 CRLF,附加至實體內容
  3. 重複直到 chunk-size == 0
  4. 讀取 footer(額外標頭),通常可忽略

PHP 解碼實作

<?php
function decodeChunked($socketFd) {
    $body = '';
    $chunkSize = (int)hexdec(fgets($socketFd, 4096));

    while (!feof($socketFd) && $chunkSize > 0) {
        $body .= fread($socketFd, $chunkSize);
        fread($socketFd, 2); // 跳過 CRLF
        $chunkSize = (int)hexdec(fgets($socketFd, 4096));
    }
    // 讀取 footer(略)
    return $body;
}
?>

關鍵點解析

  • hexdec() 將十六進位長度轉十進位
  • fgets() 逐行讀取 size 行
  • fread($fd, 2) 精確跳過 \r\n
  • 迴圈終止條件:chunkSize == 0 或 EOF

應用場景

  • 建立 HTTP 客戶端處理串流回應
  • 代理伺服器轉發 Chunked 回應
  • WebSocket 升級前的 HTTP 解析

現代替代方案:PHP 5.4+ 內建 http_response_code()、stream_context_create() 等高階函式,或使用 Guzzle、Symfony HttpClient 等成熟庫。

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