<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >压缩过滤器</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="可用过滤器列表" HREF="filters.html"><LINK REL="PREVIOUS" TITLE="转换过滤器" HREF="filters.convert.html"><LINK REL="NEXT" TITLE="加密过滤器" HREF="filters.encryption.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="section" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="filters.convert.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >附录 O. 可用过滤器列表</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="filters.encryption.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="filters.compression" >压缩过滤器</A ></H1 ><P > 虽然<A HREF="wrappers.compression.html" >压缩封装协议</A >提供了在本地文件系统中 创建 gzip 和 bz2 兼容文件的方法,但不代表可以在网络的流中提供通用压缩的意思,也不代表可以将一个非压缩的流转换成一个压缩流。对此,压缩过滤器可以在任何时候应用于任何流资源。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 压缩过滤器<SPAN CLASS="emphasis" ><I CLASS="emphasis" >不</I ></SPAN >产生命令行工具如 <TT CLASS="literal" >gzip</TT > 的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 </P ></BLOCKQUOTE ></DIV ><P > <TT CLASS="literal" >zlib.deflate</TT >(压缩)和 <TT CLASS="literal" >zlib.inflate</TT >(解压)实现了定义与 <A HREF="http://www.faqs.org/rfcs/rfc1951" TARGET="_top" >RFC 1951</A > 的压缩算法。<TT CLASS="literal" >deflate</TT > 过滤器可以接受以一个关联数组传递的最多三个参数。<CODE CLASS="parameter" >level</CODE > 定义了压缩强度(1-9)。数字更高通常会产生更小的载荷,但要消耗更多的处理时间。存在两个特殊压缩等级:0(完全不压缩)和 -1(zlib 内部默认值,目前是 6)。<CODE CLASS="parameter" >window</CODE > 是压缩回溯窗口大小,以二的次方表示。更高的值(大到 15 ―― 32768 字节)产生更好的压缩效果但消耗更多内存,低的值(低到 9 ―― 512 字节)产生产生较差的压缩效果但内存消耗低。目前默认的 <CODE CLASS="parameter" >window</CODE > 大小是 <TT CLASS="constant" ><B >15</B ></TT >。<CODE CLASS="parameter" >memory</CODE > 用来指示要分配多少工作内存。合法的数值范围是从 1(最小分配)到 9(最大分配)。内存分配仅影响速度,不会影响生成的载荷的大小。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 因为最常用的参数是压缩等级,也可以提供一个整数值作为此参数(而不用数组)。 </P ></BLOCKQUOTE ></DIV ><P > zlib.* 压缩过滤器自 PHP 版本 <TT CLASS="literal" >5.1.0</TT > 起可用,在激活 <A HREF="ref.zlib.html" >zlib</A > 的前提下。也可以通过安装来自 <A HREF="http://pecl.php.net" TARGET="_top" >PECL</A > 的 <A HREF="http://pecl.php.net/package/zlib_filter" TARGET="_top" >zlib_filter</A > 包作为一个后门在 <TT CLASS="literal" >5.0.x</TT > 版中使用。此过滤器在 PHP 4 中<SPAN CLASS="emphasis" ><I CLASS="emphasis" >不可用</I ></SPAN >。 </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN303617" ></A ><P ><B >例 O-7. <TT CLASS="literal" >zlib.deflate</TT > 和 <TT CLASS="literal" >zlib.inflate</TT > </B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$params </font><font color="#007700">= array(</font><font color="#DD0000">'level' </font><font color="#007700">=> </font><font color="#0000BB">6</font><font color="#007700">, </font><font color="#DD0000">'window' </font><font color="#007700">=> </font><font color="#0000BB">15</font><font color="#007700">, </font><font color="#DD0000">'memory' </font><font color="#007700">=> </font><font color="#0000BB">9</font><font color="#007700">);<br /><br /></font><font color="#0000BB">$original_text </font><font color="#007700">= </font><font color="#DD0000">"This is a test.\nThis is only a test.\nThis is not an important string.\n"</font><font color="#007700">;<br />echo </font><font color="#DD0000">"The original text is " </font><font color="#007700">. </font><font color="#0000BB">strlen</font><font color="#007700">(</font><font color="#0000BB">$original_text</font><font color="#007700">) . </font><font color="#DD0000">" characters long.\n"</font><font color="#007700">;<br /><br /></font><font color="#0000BB">$fp </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">'test.deflated'</font><font color="#007700">, </font><font color="#DD0000">'w'</font><font color="#007700">);<br /></font><font color="#0000BB">stream_filter_append</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">, </font><font color="#DD0000">'zlib.deflate'</font><font color="#007700">, </font><font color="#0000BB">STREAM_FILTER_WRITE</font><font color="#007700">, </font><font color="#0000BB">$params</font><font color="#007700">);<br /></font><font color="#0000BB">fwrite</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">, </font><font color="#0000BB">$original_text</font><font color="#007700">);<br /></font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">);<br /><br />echo </font><font color="#DD0000">"The compressed file is " </font><font color="#007700">. </font><font color="#0000BB">filesize</font><font color="#007700">(</font><font color="#DD0000">'test.deflated'</font><font color="#007700">) . </font><font color="#DD0000">" bytes long.\n"</font><font color="#007700">;<br />echo </font><font color="#DD0000">"The original text was:\n"</font><font color="#007700">;<br /></font><font color="#FF8000">/* Use readfile and zlib.inflate to decompress on the fly */<br /></font><font color="#0000BB">readfile</font><font color="#007700">(</font><font color="#DD0000">'php://filter/zlib.inflate/resource=test.deflated'</font><font color="#007700">);<br /><br /></font><font color="#FF8000">/* Generates output:<br /><br />The original text is 70 characters long.<br />The compressed file is 56 bytes long.<br />The original text was:<br />This is a test.<br />This is only a test.<br />This is not an important string.<br /><br /> */<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN303622" ></A ><P ><B >例 O-8. <TT CLASS="literal" >zlib.deflate</TT > 简单参数用法 </B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$original_text </font><font color="#007700">= </font><font color="#DD0000">"This is a test.\nThis is only a test.\nThis is not an important string.\n"</font><font color="#007700">;<br />echo </font><font color="#DD0000">"The original text is " </font><font color="#007700">. </font><font color="#0000BB">strlen</font><font color="#007700">(</font><font color="#0000BB">$original_text</font><font color="#007700">) . </font><font color="#DD0000">" characters long.\n"</font><font color="#007700">;<br /><br /></font><font color="#0000BB">$fp </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">'test.deflated'</font><font color="#007700">, </font><font color="#DD0000">'w'</font><font color="#007700">);<br /></font><font color="#FF8000">/* Here "6" indicates compression level 6 */<br /></font><font color="#0000BB">stream_filter_append</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">, </font><font color="#DD0000">'zlib.deflate'</font><font color="#007700">, </font><font color="#0000BB">STREAM_FILTER_WRITE</font><font color="#007700">, </font><font color="#0000BB">6</font><font color="#007700">);<br /></font><font color="#0000BB">fwrite</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">, </font><font color="#0000BB">$original_text</font><font color="#007700">);<br /></font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">);<br /><br />echo </font><font color="#DD0000">"The compressed file is " </font><font color="#007700">. </font><font color="#0000BB">filesize</font><font color="#007700">(</font><font color="#DD0000">'test.deflated'</font><font color="#007700">) . </font><font color="#DD0000">" bytes long.\n"</font><font color="#007700">;<br /><br /></font><font color="#FF8000">/* Generates output:<br /><br />The original text is 70 characters long.<br />The compressed file is 56 bytes long.<br /><br /> */<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><P > <TT CLASS="literal" >bzip2.compress</TT > 和 <TT CLASS="literal" >bzip2.decompress</TT > 工作的方式与上面讲的 zlib 过滤器相同。<TT CLASS="literal" >bzip2.compress</TT > 过滤器接受以一个关联数组给出的最多两个参数:<CODE CLASS="parameter" >blocks</CODE > 是从 1 到 9 的整数值,指定分配多少个 100K 字节的内存块作为工作区。<CODE CLASS="parameter" >work</CODE > 是 0 到 250 的整数值,指定在退回到一个慢一些,但更可靠的算法之前做多少次常规压缩算法的尝试。调整此参数仅影响到速度,压缩输出和内存使用都不受此设置的影响。将此参数设为 0 指示 bzip 库使用内部默认算法。<TT CLASS="literal" >bzip2.decompress</TT > 过滤器仅接受一个参数,可以用普通的布尔值传递,或者用一个关联数组中的 <CODE CLASS="parameter" >small</CODE > 单元传递。当 <CODE CLASS="parameter" >small</CODE > 设为 <TT CLASS="constant" ><B >TRUE</B ></TT > 值时,指示 bzip 库用最小的内存占用来执行解压缩,代价是速度会慢一些。 </P ><P > bzip2.* 压缩过滤器自 PHP 版本 <TT CLASS="literal" >5.1.0</TT > 起可用,在激活 <A HREF="ref.bzip2.html" >bz2</A > 支持的前提下。也可以通过安装来自 <A HREF="http://pecl.php.net" TARGET="_top" >PECL</A > 的<A HREF="http://pecl.php.net/package/bz2_filter" TARGET="_top" >bz2_filter</A > 包作为一个后门在 <TT CLASS="literal" >5.0.x</TT > 版中使用。此过滤器在 PHP 4 中<SPAN CLASS="emphasis" ><I CLASS="emphasis" >不可用</I ></SPAN >。 </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN303643" ></A ><P ><B >例 O-9. <TT CLASS="literal" >bzip2.compress</TT > 和 <TT CLASS="literal" >bzip2.decompress</TT > </B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$param </font><font color="#007700">= array(</font><font color="#DD0000">'blocks' </font><font color="#007700">=> </font><font color="#0000BB">9</font><font color="#007700">, </font><font color="#DD0000">'work' </font><font color="#007700">=> </font><font color="#0000BB">0</font><font color="#007700">);<br /><br />echo </font><font color="#DD0000">"The original file is " </font><font color="#007700">. </font><font color="#0000BB">filesize</font><font color="#007700">(</font><font color="#DD0000">'LICENSE'</font><font color="#007700">) . </font><font color="#DD0000">" bytes long.\n"</font><font color="#007700">;<br /><br /></font><font color="#0000BB">$fp </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">'LICENSE.compressed'</font><font color="#007700">, </font><font color="#DD0000">'w'</font><font color="#007700">);<br /></font><font color="#0000BB">stream_filter_append</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">, </font><font color="#DD0000">'bzip2.compress'</font><font color="#007700">, </font><font color="#0000BB">STREAM_FILTER_WRITE</font><font color="#007700">, </font><font color="#0000BB">$param</font><font color="#007700">);<br /></font><font color="#0000BB">fwrite</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">, </font><font color="#0000BB">file_get_contents</font><font color="#007700">(</font><font color="#DD0000">'LICENSE'</font><font color="#007700">));<br /></font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">);<br /><br />echo </font><font color="#DD0000">"The compressed file is " </font><font color="#007700">. </font><font color="#0000BB">filesize</font><font color="#007700">(</font><font color="#DD0000">'LICENSE.compressed'</font><font color="#007700">) . </font><font color="#DD0000">" bytes long.\n"</font><font color="#007700">;<br /><br /></font><font color="#FF8000">/* Generates output:<br /><br />The original text is 3288 characters long.<br />The compressed file is 1488 bytes long.<br /><br /> */<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="filters.convert.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="filters.encryption.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >转换过滤器</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="filters.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >加密过滤器</TD ></TR ></TABLE ></DIV ></BODY ></HTML >