PHP使用zlib扩展实现页面GZIP压缩输出

jopen 11年前

GZIP(GNU-ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更小。这样用户浏览的时候就会感觉很爽很愉快!
要实现GZIP压缩页面需要浏览器和服务器共同支持,实际上就是服务器压缩,传到浏览器后浏览器解压并解析。浏览器那边不需要我们担心,因为现在绝大多数浏览器都支持解析GZIP过的页面。我们只要把页面在服务器端压缩再输出到浏览器就行了。

要压缩一个页面,首先要获得要输出的内容。PHP中的ob_start()(ob => output buffer)函数可以实现这个功能,它可以把程序里准备输出的内容先放到一个叫做“缓冲区”的地方,这个函数一定要在页面输出之前使用,所以一般把它放在代码的最顶端。用ob_start()得到要压缩的页面之后,我们就可以压缩页面了!

代码

function ob_gzip($content) // $content 就是要压缩的页面内容      {      if(!headers_sent() && extension_loaded("zlib") &&strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip"))//判断页面头部信息是否输出,PHP中zlib扩展是否已经加载,浏览器是否支持GZIP技术   {   $content = gzencode($content." \n//此页已压缩",9); //为准备压缩的内容贴上“//此页已压缩”的注释标签,然后用zlib提供的gzencode()函数执行级别为9的压缩,这个参数值范围是0-9,0表示无压缩,9表示最大压缩,当然压缩程度越高越费CPU。   //用header()函数给浏览器发送一些头部信息,告诉浏览器这个页面已经用GZIP压缩过了!   header(“Content-Encoding: gzip”);   header(“Vary: Accept-Encoding”);   header(“Content-Length: “.strlen($content));   }   return $content; //返回压缩的内容

函数写好后,就用ob_start调用它,于是原来的ob_start()变成

ob_start('ob_gzip'); //给ob_start()加一个参数,参数名就是刚才的函数名。这样当内容进入缓冲区后PHP就会调用ob_gzip函数把它压缩了。

最后结束缓冲区

ob_end_flush(); //结束缓冲区,输出内容。当然,不用这个函数也行,因为程序执行到最后会自动将缓冲区内容输出。

最终完整的实例

<?php   //调用一个函数名为ob_gzip的内容进行压缩   ob_start('ob_gzip');   //输出内容   ob_end_flush();   //这是ob_gzip函数   function ob_gzip($content)   {   if(!headers_sent()&&extension_loaded("zlib")   &&strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip"))   {   $content = gzencode($content." \n//此页已压缩",9);   header("Content-Encoding: gzip");   header("Vary: Accept-Encoding");   header("Content-Length: ".strlen($content));   }   return $content;   }   ?>