雖然 壓縮封裝協(xié)議 提供了在本地文件系統(tǒng)中 創(chuàng)建 gzip 和 bz2 兼容文件的方法,但不代表可以在網(wǎng)絡(luò)的流中提供通用壓縮的意思, 也不代表可以將一個(gè)非壓縮的流轉(zhuǎn)換成一個(gè)壓縮流。對(duì)此,壓縮過(guò)濾器可以在任何時(shí)候應(yīng)用于任何流資源。
注意: 壓縮過(guò)濾器不產(chǎn)生命令行工具如
gzip
的頭和尾信息。只是壓縮和解壓數(shù)據(jù)流中的有效載荷部分。
zlib.deflate
(壓縮)和
zlib.inflate
(解壓)實(shí)現(xiàn)了定義與
? RFC 1951 的壓縮算法。
deflate
過(guò)濾器可以接受以一個(gè)關(guān)聯(lián)數(shù)組傳遞的最多三個(gè)參數(shù)。
level
定義了壓縮強(qiáng)度(1-9)。
數(shù)字更高通常會(huì)產(chǎn)生更小的載荷,但要消耗更多的處理時(shí)間。
存在兩個(gè)特殊壓縮等級(jí):0(完全不壓縮)和 -1(zlib 內(nèi)部默認(rèn)值,目前是 6)。
window
是壓縮回溯窗口大小,以二的次方表示。
更高的值(大到 15 —— 32768 字節(jié))產(chǎn)生更好的壓縮效果但消耗更多內(nèi)存,
低的值(低到 9 —— 512 字節(jié))產(chǎn)生產(chǎn)生較差的壓縮效果但內(nèi)存消耗低。
目前默認(rèn)的 window
大小是 15
。
memory
用來(lái)指示要分配多少工作內(nèi)存。
合法的數(shù)值范圍是從 1(最小分配)到 9(最大分配)。
內(nèi)存分配僅影響速度,不會(huì)影響生成的載荷的大小。
注意: 因?yàn)樽畛S玫膮?shù)是壓縮等級(jí),也可以提供一個(gè)整數(shù)值作為此參數(shù)(而不用數(shù)組)。
在激活 zlib 的前提下可以使用 zlib.* 壓縮過(guò)濾器。
示例 #1
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";
/* 使用 readfile 和 zlib.inflate 即時(shí)解壓縮 */
readfile('php://filter/zlib.inflate/resource=test.deflated');
/* 生成的輸出:
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.
*/
?>
示例 #2
zlib.deflate
簡(jiǎn)單參數(shù)用法
<?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');
/* 這里的 “6” 代表壓縮級(jí)別為 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";
/* 生成的輸出:
The original text is 70 characters long.
The compressed file is 56 bytes long.
*/
?>
bzip2.compress
和
bzip2.decompress
工作的方式與上面講的 zlib 過(guò)濾器相同。
bzip2.compress
過(guò)濾器接受以一個(gè)關(guān)聯(lián)數(shù)組給出的最多兩個(gè)參數(shù):
blocks
是從 1 到 9 的整數(shù)值,指定分配多少個(gè) 100K 字節(jié)的內(nèi)存塊作為工作區(qū)。
work
是 0 到 250 的整數(shù)值,指定在退回到一個(gè)慢一些,
但更可靠的算法之前做多少次常規(guī)壓縮算法的嘗試。調(diào)整此參數(shù)僅影響到速度,
壓縮輸出和內(nèi)存使用都不受此設(shè)置的影響。將此參數(shù)設(shè)為 0 指示 bzip 庫(kù)使用內(nèi)部默認(rèn)算法。
bzip2.decompress
過(guò)濾器僅接受一個(gè)參數(shù),可以用普通的布爾值傳遞,
或者用一個(gè)關(guān)聯(lián)數(shù)組中的 small
單元傳遞。
當(dāng) small
設(shè)為 &true; 值時(shí),指示 bzip 庫(kù)用最小的內(nèi)存占用來(lái)執(zhí)行解壓縮,
代價(jià)是速度會(huì)慢一些。
在激活 bz2 支持的前提下可以使用 bzip2.* 壓縮過(guò)濾器。
示例 #3
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";
/* 生成的輸出:
The original text is 3288 characters long.
The compressed file is 1488 bytes long.
*/
?>