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

深入理解 PHP Stream 流:概念、用法與實戰範例

     編輯:PHP 相關知識

Stream(流)是 PHP 中最容易被忽視卻極其強大的功能之一,屬於 SPL、pack 函數、封裝協議等核心系列。簡單來說,Stream 就是資料在來源與目的地之間流動的通道,概念源自 UNIX 管道,PHP 的實現與 Java 的流機制同源同構。

核心概念

  • 輸入流 / 輸出流:資料流向的方向
  • 封裝協議:file://、https://、ftp://、php://、zlib:// 等
  • 流上下文:stream_context_create() 建立的參數集,可注入 HTTP Header、POST 數據、SSL 選項等
  • 過濾器:掛載在流上的轉換層,如 string.rot13、zlib.*、自定義過濾器

實戰範例速覽

1. Socket 通訊的兩種寫法

<?php
// 傳統 fsockopen
$fp = fsockopen("example.com", 80, $errno, $errstr, 5);
// Stream 封裝寫法(更簡潔)
$fp = stream_socket_client("tcp://example.com:80", $errno, $errstr, 3);

2. 使用 HTTP 上下文模擬 POST 請求

<?php
$data = http_build_query(['key' => 'value']);
$opts = [
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-type: application/x-www-form-urlencoded\r\nContent-Length: " . strlen($data),
        'content' => $data
    ]
];
$context = stream_context_create($opts);
$result = file_get_contents('https://api.example.com/endpoint', false, $context);

3. 內建過濾器與自定義過濾器

<?php
// 列出所有內建過濾器
print_r(stream_get_filters());

// 使用 rot13 過濾器
$fp = fopen('test.txt', 'w+');
stream_filter_append($fp, 'string.rot13', STREAM_FILTER_WRITE);
fwrite($fp, 'Hello World'); // 實際寫入經過 ROT13 加密
rewind($fp);
fpassthru($fp); // 輸出:Uryyb Jbeyq

// 自定義 MD5 過濾器
class md5_filter extends php_user_filter {
    public function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = md5($bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}
stream_filter_register('string.md5', 'md5_filter');
// 之後可用 stream_filter_append($fp, 'string.md5', STREAM_FILTER_WRITE);

4. 串流封裝器

實現 streamWrapper 介面,即可讓 fopen()、file_get_contents() 等函數透明操作自定義協議(如 s3://、redis://),達到「同一介面、異構儲存」的解耦效果。

為什麼要掌握 Stream?

  • 統一介面:本地檔案、網路請求、壓縮流、加密流皆可用相同 API 操作
  • 記憶體效率:流式處理大檔案避免一次性載入記憶體
  • 擴展性:自定義封裝協議與過濾器,滿足業務特殊需求
  • 調試利器:掛載日誌過濾器,無侵入式記錄 Socket 收發內容

掌握 Stream,能將 PHP 從「單純的 Web 模板引擎」提升為具備系統級 I/O 處理能力的語言,對於高併發、大檔案、微服務通訊等場景尤為關鍵。

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