PHP Conference Japan 2024

stream_filter_append

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_filter_append附加篩選器到串流

說明

stream_filter_append(
    資源 $stream,
    字串 $filtername,
    整數 $read_write = ?,
    混合 $params = ?
): 資源

filtername 加入附加到 stream 的篩選器清單中。

參數

stream

目標串流。

filtername

篩選器名稱。

read_write

預設情況下,如果檔案是以讀取模式開啟(例如檔案模式:r 和/或 +),stream_filter_append() 會將過濾器附加到 讀取過濾器鏈。如果檔案是以寫入模式開啟(例如檔案模式:wa 和/或 +),則過濾器也會附加到 寫入過濾器鏈。也可以將 STREAM_FILTER_READSTREAM_FILTER_WRITE 和/或 STREAM_FILTER_ALL 傳遞給 read_write 參數來覆寫此行為。

參數

此過濾器會使用指定的 params 參數添加到列表的*末尾*,因此在串流操作期間會最後被呼叫。要將過濾器添加到列表的開頭,請使用 stream_filter_prepend()

傳回值

成功時傳回資源,失敗時傳回 false。此資源可用於在呼叫 stream_filter_remove() 時參考此過濾器執行個體。

如果 stream 不是資源,或者找不到 filtername,則會傳回 false

範例

範例 #1 控制過濾器的應用位置

<?php
/* 開啟一個測試檔案以進行讀寫 */
$fp = fopen('test.txt', 'w+');

/* 將 ROT13 過濾器應用於
* 寫入過濾器鏈,但不應用於
* 讀取過濾器鏈 */
stream_filter_append($fp, "string.rot13", STREAM_FILTER_WRITE);

/* 將一個簡單的字串寫入檔案
* 它會在輸出時被 ROT13 轉換 */
fwrite($fp, "This is a test\n");

/* 返回到檔案的開頭 */
rewind($fp);

/* 將檔案的內容讀回。
* 如果過濾器也被應用於
* 讀取過濾器鏈,我們會看到
* 文字被 ROT13 轉換回原始狀態 */
fpassthru($fp);

fclose($fp);

/* 預期輸出
---------------

Guvf vf n grfg

*/
?>

注意事項

注意使用自訂(使用者)過濾器時
必須先呼叫 stream_filter_register() 才能將所需的使用者過濾器註冊到 filtername

注意 串流資料會以區塊的形式從資源(本地和遠端)讀取,任何未使用的資料都會保留在內部緩衝區中。當新的過濾器附加到串流時,內部緩衝區中的資料會立即通過新的過濾器進行處理。這與 stream_filter_prepend() 的行為不同。

注意事項當讀寫都加上篩選器時,會建立兩個篩選器實例。必須使用 STREAM_FILTER_READSTREAM_FILTER_WRITE 分別呼叫兩次 stream_filter_append() 才能取得兩個篩選器資源。

另請參閱

新增註釋

使用者貢獻的註釋 2 則註釋

Dan J
8 年前
請注意,套用至 STDOUT 的串流篩選器在透過 echo 或 print 輸出時不會被呼叫。

使用標準 ROT13 篩選器可以輕鬆示範
<?php
stream_filter_append
( STDOUT, "string.rot13" );

print
"Hello PHP\n";
// 輸出 "Hello PHP"

fprintf( STDOUT, "Hello PHP\n" );
// 輸出 "Uryyb CUC"
?>

如果您想要篩選 STDOUT,透過 ob_start 加入輸出緩衝回呼函式可能會更好
https://php.dev.org.tw/manual/en/function.ob-start.php

在撰寫本文時,有一個開啟的 PHP 功能請求,以支援 echo 和 print 的串流篩選器
https://bugs.php.net/bug.php?id=30583
net_navard at yahoo dot com
18 年前
各位朋友,您好

將串流篩選器新增到篩選器列表的開頭或結尾的差異,僅在於它們套用至串流的順序。

例如,如果您正在從檔案讀取資料,並且使用 stream_filter_prepend() 將特定篩選器放置在第一個位置,則資料將會先由該篩選器處理。

此範例讀取檔案資料,並且在讀取操作開始時套用篩選器

<?php
/* 開啟一個測試檔案以供讀取 */
$fp = fopen("test.txt", "r");
/* 將 ROT13 篩選器應用於
* 讀取篩選器鏈,但不應用於
* 寫入篩選器鏈 */
stream_filter_prepend($fp, "string.rot13",
STREAM_FILTER_READ);
// 讀取檔案資料
$contents=fread($fp,1024);
// 檔案資料會先被篩選後儲存在 $contents 中
echo $contents;
fclose($fp);
?>

另一方面,如果使用 stream_filter_append(),則篩選器將會應用於資料操作的末端。這件事只與篩選器應用於串流的順序有關。回到範例,從檔案資料中移除換行符號然後計算字元數,與執行相反的過程並不相同。在這種情況下,篩選器應用於串流的順序很重要。

此範例將測試字串寫入檔案。篩選器應用於寫入操作的末端。

<?php
/* 開啟一個測試檔案以供寫入 */
$fp = fopen("test.txt", "w+");
/* 將 ROT13 篩選器應用於
* 寫入篩選器鏈,但不應用於
* 讀取篩選器鏈 */
stream_filter_append($fp, "string.rot13",
STREAM_FILTER_WRITE);
/* 將一個簡單的字串寫入檔案
* 它將在串流操作結束時
* 進行 ROT13 轉換 */
fwrite($fp, "This is a test\n"); // 字串資料會先被寫入,然後進行 ROT13 轉換,最後寫入檔案
/* 返回檔案的開頭 */
rewind($fp);
$contents=fread($fp,512);
fclose($fp);
echo
$contents;
?>

在第一種情況下,資料在寫入操作結束時進行轉換,而在第二種情況下,資料會先被篩選,然後儲存在 $contents 中。

此致
Hossein
To Top