操作方法:
对于PHP文件传输中压缩,只需在原来的 PHP 文件首行加上
<?php if(extension_loaded(‘zlib‘)){ob_start(‘ob_gzhandler‘);} ?>
并且在结尾加上
<?php if(extension_loaded(‘zlib‘)){ob_end_flush();} ?>
复制时还原为正规的PHP格式。
对于js文件,则在原来js文件的首行加上
<?php if(extension_loaded(‘zlib‘)){ob_start(‘ob_gzhandler‘);}header(“Content-Type: text/javascript“);?>
末尾同样加上
<?php if(extension_loaded(‘zlib‘)){ob_end_flush();} ?>
然后存为abc.js.PHP这样的文件,并且修改指向这个所有html,PHP等文件。
改
<script type=“text/javascript“ src=“abc.js“ charset=“utf-8“></script>
为
<script type=“text/javascript“ src=“abc.js.php“ charset=“utf-8“></script>
对于a.html文件就直接改成a.PHP访问好了,如果要保留原来的URL就 修改.htaccess 伪URL或者建立一个网页跳转吧,而其他的CSS等文本也就依此推算出该怎么改了。
压缩效能说明:jQuery库源代码为50k左右,先写代码时优化,去除空格组合函数等使其减小至26k,再使用GZIP压缩至14k!
自定义ob_gzhandler:
function ob_gzip($content) // $content 就是要压缩的页面内容,或者说饼干原料
{
if( !headers_sent() && // 如果页面头部信息还没有输出
extension_loaded("zlib") && // 而且zlib扩展已经加载到PHP中
strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")) //而且浏览器说它可以接受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_gzhandler存在问题:
如果使用ob_start("ob_gzhandler");
则ob_clean()后面的输出将不显示,这是个bug,
可以用ob_end_clean();ob_start("ob_gzhandler"); 代替ob_clean();
否则后面输出内容将是空。
<?php
error_reporting(E_ALL);
ob_start("ob_gzhandler");
echo "content";
ob_clean();
echo "more content";
?>
上面的代码期望输出more content实际上什么内容也不会输出。
最稳定的启用页面压缩的方法:
<?php
if(extension_loaded('zlib')) {
ini_set('zlib.output_compression', 'On');
ini_set('zlib.output_compression_level', '3');
}
?>
参考文章: