PHP使用zlib扩展实现GZIP压缩输出的方法详解


Posted in PHP onApril 09, 2018

本文实例讲述了PHP使用zlib扩展实现GZIP压缩输出的方法。分享给大家供大家参考,具体如下:

一般情况下我们出现大量数据传输理希望减少服务器的带宽压力,会采取一种方式来压缩文件传输,php中用zlib也可以实现gzip压缩输出,下面我们来看GZIP压缩输出各种方法总结.

GZIP(GNU-ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更小。这样用户浏览的时候就会感觉很爽很愉快!

准备工作

1、找不到php_zlib.dll文件?

自php4.3开始zlib压缩就已经内置在php中了,所以至少Windows环境下是不需要安装zlib的。

2、安装搭建php运行环境

由于光通过php.ini配置文件开启gzip配置实现php gzip压缩输出是不行的,其需要apache的支持,所以建议安装搭建php+apache+mysql运行环境。

php gzip配置步骤

一、打开php.ini配置文件,找到zlib.output_compression = Off,将

zlib.output_compression = Off
;zlib.output_compression_level = -1

修改为

zlib.output_compression = On
zlib.output_compression_level = 6

实例1

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

代码

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;
}
?>

实例2

zlib压缩和解压缩swf文件的代码

文件的例子:

//没有加入判断swf文件是否已经压缩,入需要可以根据文件的第一个字节是'F'或者'C'来判断
压缩swf文件:
//--------------------------------------------------------------------------------------------------
//文件名
$filename = "test.swf";
//打开文件
$rs = fopen($filename,"r");
//读取文件的数据
$str = fread($rs,filesize($filename));
//设置swf头文件
$head = substr($str,1,8);
$head = "C".$head;
//获取swf文件内容
$body = substr($str,8);
//压缩文件内容,使用最高压缩级别9
$body = gzcompress($body, 9);
//合并文件头和内容
$str = $head.$body;
//关闭读取的文件流
fclose($rs);
//创建一个新的文件
$ws = fopen("create.swf","w");
//写文件
fwrite($ws,$str);
//关闭文件留
fclose($ws);
//----------------------------------------------------------------------------------------------------
?>

解压缩swf文件:

//----------------------------------------------------------------------------------------------------
//文件名
$filename = "test.swf";
//打开文件
$rs = fopen($filename,"r");
//读取文件的数据
$str = fread($rs,filesize($filename));
//设置swf头文件
$head = substr($str,1,8);
$head = "F".$head;
//获取swf文件内容
$body = substr($str,8);
//解压缩文件内容
$body = gzuncompress($body);
//合并文件头和内容
$str = $head.$body;
//关闭读取的文件流
fclose($rs);
//创建一个新的文件
$ws = fopen("create.swf","w");
//写文件
fwrite($ws,$str);
//关闭文件留
fclose($ws);
//----------------------------------------------------------------------------------------------------
?>

实例3

开启php zlib(gzip)压缩输出

php gzip配置知识点:

1、默认php是不开启zlib整站压缩输出的,而是通过对需要压缩输出的页面使用ob_gzhandler函数实现,两者只能二选一,否则会报错。

2、zlib.output_compression默认值为Off,你可以将其设置为On,或者output buffer size(默认为4k)

3、zlib.output_compression_level代表压缩比,默认推荐设置压缩比值为6,可选范围为1-9,-1代表关闭php zlib(gzip)压缩

二、保存php.ini配置文件,并重启apache服务器

三、打开apache 配置文件httpd.conf,配置装载deflate_module

这一步是最关键的开启php gzip压缩输出配置步骤,很多网友会说我已经开启了php.ini配置文件中的php gzip配置怎么还是没有实现php gzip压缩,就是因为没有让apache装载deflate_module,方法如下,将

#LoadModule deflate_module modules/mod_deflate.so

去除开头的#号,并重启apache即可。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP与javascript对多项选择的处理
Oct 09 PHP
linux iconv方法的使用
Oct 01 PHP
很让人受教的 提高php代码质量36计
Sep 05 PHP
写一段简单的PHP建立文件夹代码
Jan 06 PHP
php中$_POST与php://input的区别实例分析
Jan 07 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 PHP
Yii2中datetime类的使用
Dec 17 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
Apr 09 #PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 #PHP
PHP+Session防止表单重复提交的解决方法
Apr 09 #PHP
PHP创建自己的Composer包方法
Apr 09 #PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 #PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 #PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 #PHP
You might like
网站用php实现paypal整合方法
2010/11/28 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
收集的几个Python小技巧分享
2014/11/22 Python
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
大学生职业生涯规划书参考模板
2014/03/05 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript