Stream(流)是 PHP 中最容易被忽視卻極其強大的功能之一,屬於 SPL、pack 函數、封裝協議等核心系列。簡單來說,Stream 就是資料在來源與目的地之間流動的通道,概念源自 UNIX 管道,PHP 的實現與 Java 的流機制同源同構。
file://、https://、ftp://、php://、zlib:// 等stream_context_create() 建立的參數集,可注入 HTTP Header、POST 數據、SSL 選項等string.rot13、zlib.*、自定義過濾器<?php
// 傳統 fsockopen
$fp = fsockopen("example.com", 80, $errno, $errstr, 5);
// Stream 封裝寫法(更簡潔)
$fp = stream_socket_client("tcp://example.com:80", $errno, $errstr, 3);
<?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);
<?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);
實現 streamWrapper 介面,即可讓 fopen()、file_get_contents() 等函數透明操作自定義協議(如 s3://、redis://),達到「同一介面、異構儲存」的解耦效果。
掌握 Stream,能將 PHP 從「單純的 Web 模板引擎」提升為具備系統級 I/O 處理能力的語言,對於高併發、大檔案、微服務通訊等場景尤為關鍵。