當前位置: 首頁> 最新文章列表> 使用stream_get_filters獲取已加載過濾器的列表

使用stream_get_filters獲取已加載過濾器的列表

gitbox 2025-05-20

在PHP中,流過濾器(stream filters)是一種強大的機制,允許你在數據被讀取或寫入流之前對其進行處理。比如,你可以在讀取文件時自動將內容轉為大寫,或者在寫入網絡請求時自動壓縮內容。

要查看當前PHP環境中已經加載的所有過濾器,可以使用stream_get_filters()函數。這個函數會返回一個包含所有已註冊過濾器名稱的數組。

下面我們來看具體的使用示例。

基本用法

<?php
$filters = stream_get_filters();

echo "已加載的過濾器列表:\n";
foreach ($filters as $filter) {
    echo "- {$filter}\n";
}
?>

運行這段代碼後,你會看到類似以下的輸出(具體取決於你的PHP環境):

 已加載的過濾器列表:
- string.rot13
- string.toupper
- string.tolower
- convert.iconv.*
- convert.*
- zlib.*
- bzip2.*

這些過濾器可以直接用於stream_filter_append()stream_filter_prepend()等函數中,對流進行動態處理。

實例:使用過濾器修改文件內容

假設我們有一個文本文件example.txt ,裡面的內容全是小寫字母。我們希望讀取它,並在輸出時自動轉換為大寫。

 <?php
$filename = 'example.txt';
$handle = fopen($filename, 'r');

if ($handle) {
    stream_filter_append($handle, 'string.toupper');

    while (!feof($handle)) {
        echo fgets($handle);
    }

    fclose($handle);
} else {
    echo "無法打開文件: {$filename}";
}
?>

這段代碼會在讀取文件時自動將內容轉為大寫,而你無需手動調用strtoupper()

檢查是否支持某個過濾器

如果你的代碼依賴特定的過濾器,最好先檢查它是否已加載:

 <?php
$neededFilter = 'string.toupper';
$filters = stream_get_filters();

if (in_array($neededFilter, $filters)) {
    echo "過濾器 {$neededFilter} 已加載,準備使用。\n";
} else {
    echo "過濾器 {$neededFilter} 不可用,請檢查PHP配置。\n";
}
?>

使用URL中的過濾器

有些情況下,你可能會通過URL方式使用流過濾器,例如訪問php://filter

 <?php
$url = 'php://filter/read=string.toupper/resource=https://gitbox.net/example.txt';
$content = file_get_contents($url);

if ($content !== false) {
    echo $content;
} else {
    echo "無法讀取遠程資源。";
}
?>

這段代碼會在從https://gitbox.net/example.txt讀取內容時,將其直接轉換為大寫。