雖然壓縮封裝協定提供了在本地檔案系統中
建立 gzip 和 bz2
相容檔案的方法,但不代表可以在網路的流中提供通用壓縮的意思,也不代表可以將一個非壓縮的流轉換成一個壓縮流。對此,壓縮過濾器可以在任何時候套用於任何流資源。
注:
壓縮過濾器不產生指令行工具如
gzip 的頭和尾訊息。只是壓縮和解壓資料流中的有效載荷部分。
zlib.deflate(壓縮)和
zlib.inflate(解壓)實現了定義與
RFC 1951
的壓縮算法。deflate
過濾器可以接受以一個關聯陣列傳遞的最多三個參數。level
定義了壓縮強度(1-9)。數字更高通常會產生更小的載荷,但要消耗更多的處理時間。存在兩個特殊壓縮等級:0(完全不壓縮)和
-1(zlib 內定預設值,目前是 6)。window
是壓縮回溯視窗大小,以二的次方表示。更高的值(大到 15 -- 32768
位元組)產生更好的壓縮效果但消耗更多記憶體,低的值(低到 9 -- 512
位元組)產生產生較差的壓縮效果但記憶體消耗低。目前預設的
window 大小是 15。memory
用來指示要配置多少工作記憶體。合法的數值範圍是從 1(最小配置)到
9(最大配置)。記憶體配置僅影響速度,不會影響建立的載荷的大小。
注:
因為最常用的參數是壓縮等級,也可以提供一個整數值作為此參數(而不用陣列)。
zlib.* 壓縮過濾器自 PHP 版本 5.1.0 起可用,在啟動
zlib 的前提下。也可以通過安裝來自
PECL 的 zlib_filter 包作為一個後門在
5.0.x 版中使用。此過濾器在 PHP 4 中不可用。
例子 N-7.
zlib.deflate 和
zlib.inflate
<?php $params = array('level' => 6, 'window' => 15, 'memory' => 9);
$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n"; echo "The original text is " . strlen($original_text) . " characters long.\n";
$fp = fopen('test.deflated', 'w'); stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, $params); fwrite($fp, $original_text); fclose($fp);
echo "The compressed file is " . filesize('test.deflated') . " bytes long.\n"; echo "The original text was:\n"; /* Use readfile and zlib.inflate to decompress on the fly */ readfile('php://filter/zlib.inflate/resource=test.deflated');
/* Generates output:
The original text is 70 characters long. The compressed file is 56 bytes long. The original text was: This is a test. This is only a test. This is not an important string.
*/ ?>
|
|
例子 N-8.
zlib.deflate 簡單參數用法
<?php $original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n"; echo "The original text is " . strlen($original_text) . " characters long.\n";
$fp = fopen('test.deflated', 'w'); /* Here "6" indicates compression level 6 */ stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, 6); fwrite($fp, $original_text); fclose($fp);
echo "The compressed file is " . filesize('test.deflated') . " bytes long.\n";
/* Generates output:
The original text is 70 characters long. The compressed file is 56 bytes long.
*/ ?>
|
|
bzip2.compress 和
bzip2.decompress 工作的模式與上面講的 zlib
過濾器相同。bzip2.compress
過濾器接受以一個關聯陣列給出的最多兩個參數:blocks
是從 1 到 9 的整數值,指定配置多少個 100K
位元組的記憶體塊作為工作區。work 是 0 到 250
的整數值,指定在退回到一個慢一些,但更可靠的算法之前做多少次一般壓縮算法的嘗試。調整此參數僅影響到速度,壓縮輸出和記憶體使用都不受此設定的影響。將此參數設為
0 指示 bzip 庫使用內定預設算法。bzip2.decompress
過濾器僅接受一個參數,可以用普通的布林值傳遞,或是用一個關聯陣列中的
small 單元傳遞。當 small
設為 TRUE 值時,指示 bzip 庫用最小的記憶體佔用來執行解壓縮,代價是速度會慢一些。
bzip2.* 壓縮過濾器自 PHP 版本 5.1.0 起可用,在啟動
bz2 支援的前提下。也可以通過安裝來自
PECL 的bz2_filter 包作為一個後門在
5.0.x 版中使用。此過濾器在 PHP 4 中不可用。
例子 N-9.
bzip2.compress 和
bzip2.decompress
<?php $param = array('blocks' => 9, 'work' => 0);
echo "The original file is " . filesize('LICENSE') . " bytes long.\n";
$fp = fopen('LICENSE.compressed', 'w'); stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE, $param); fwrite($fp, file_get_contents('LICENSE')); fclose($fp);
echo "The compressed file is " . filesize('LICENSE.compressed') . " bytes long.\n";
/* Generates output:
The original text is 3288 characters long. The compressed file is 1488 bytes long.
*/ ?>
|
|