php内存占用分析(PHP基础之输出缓冲区基本概念、原理分析)
php内存占用分析
PHP基础之输出缓冲区基本概念、原理分析本文实例讲述了php基础之输出缓冲区。分享给大家供大家参考,具体如下:
一、概念
在php运行的过程中,可以将会产生输出的函数或操作结果暂时保存在php的缓冲区,只有当缓冲区满了、或者php运行完毕、或者在必要时候进行输出,才会将数据输出到浏览器,此缓冲数据的区域称为php的输出缓冲区(ob)。
二、原理
①使用了缓冲区之后,当执行php的时候,如果碰到了echo、print_r之类的会输出数据的代码(实际上许多函数都会产生输出),php就会将要输出的数据放到php自身的缓冲区,等待输出;
②当php自身的缓冲区接到指令,指示要输出缓冲区的内容时,将会把缓冲区内的数据输出到服务器上, 服务器接受到php输出的数据,然后再把该数据存在到服务器自身的缓冲区内,等到输出;
③当服务器接受到指令,只是要输出缓冲区的内容时, 将会把缓冲区的内容输出,返回到浏览器。
上面可以看出,输出缓冲区层不是唯一用于缓冲输出的层,它实际上只是很多层中的一个。最后一点你要记住输出缓冲区层的行为跟你使用的sapi(web或cli)相关,不同的sapi可能有不同的行为。
第一点概念有提到,缓冲区满了会将缓冲数据输出,这个跟sapi有关,缓冲区主要是通过php.ini中的output_buffering变量控制。output_buffering的默认是on,默认值是4096(4kb)。
三、输出缓冲区的配置
1、以我们通常使用的php-fpm这种sapi为例,这里总结一下php的ini文件配置,主要为三个选项:
output_buffering
implicit_flush
output_handler
通过一个表格来理清一下这三个参数的含义:
注意,以上三个值不能在运行时使用ini_set()改这几个选项的值。
2、关于php cli方式执行时的配置,与fpm不太一样,有几点需要注意的是:
(1) output_buffering参数默认是不开启的,
(2) implicit_flush参数默认被置为1(开启)。
3、关于output_handler设置回调函数,可参考一下几个常用设置:
①ob_gzhandler : 使用ext/zlib压缩输出;
②mb_output_handler : 使用ext/mbstring转换字符编码;
③ob_iconv_handler : 使用ext/iconv转换字符编码;
④ob_tidyhandler : 使用ext/tidy整理输出的html文本;
⑤ob_[inflate/deflate]_handler : 使用ext/http压缩输出;
⑥ob_etaghandler : 使用ext/http自动生成http的etag;
四、输出缓冲区相关方法
ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到下一层,而是保存在输出缓冲区里面。
ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。
ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。
ob_get_clean(); //返回内部缓冲区的内容,关闭缓冲区。
ob_flush(); //发送缓冲区内容到下一层,删除缓冲区内容,不关闭缓冲区。
ob_end_flush(); //发送缓冲区内容到下一层,删除缓冲区的内容,关闭缓冲区。
ob_get_flush(); //返回缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。
ob_get_contents(); //返回缓冲区的内容,不输出。
ob_get_length(); //返回缓冲区的长度,如果缓冲区未被激活,则返回false。
ob_get_status() ; //得到所有输出缓冲区的状态。
ob_implicit_flush(); //打开/关闭绝对刷送。
五、输出缓冲区的应用
1、在session、cookie、header等设置函数之前开启:
最常见的就是在使用header函数之前,就已经输出了某些数据,这样会导致某些错误,例如 cannot modify header information – headers already sent by;
出现这个错误的原因是, 在header之前已经输出了某些数据,而输出这些数据的同时, 服务器将会同时发送一个响应状态到浏览器上(既然有输出,即这个请求是有效的),而其后你又再次使用header函数
发送http头,则会返回这个错误,错误的意思是:http头已经发送出去了,你不能对他再做修改。
因此可以在开头先开启ob_start方法。
2、控制php程序的下载功能:
通常很多人会用php实现文件下载,但是当一个文件大小过大(例如100m)时,如果先全部读入内存再传送给用户,会导致响应时间大大加长(甚至超时),同时内存占用也会大大增加(甚至溢出)。
使用输出缓冲,可以将读取的文件读入缓冲区,达到一定大小时传送给用户,再继续读取,实现分片的效果。这样浏览器就可以持续地接受到数据,而不必等到所有文件读取完毕,同时内存也不会占用太大。
3、作为静态文件缓存:
将需要多次反复读取,并且求改频率很低的文件,第一次读取时放入缓冲区,生成静态文件,之后每次读取可以直接返回而不需要进过php的处理(读取数据库等)。
希望本文所述对大家php程序设计有所帮助。
原文链接:https://blog.csdn.net/dream_successor/article/details/75246408
- php定时执行PHP(Cpanel下Cron Jobs定时执行PHP的方法)
- dedecms最新手册(在自己的php页面中使用dedecms标签的代码示例)
- php框架创建控制器代码(php连接sftp的作用以及实例代码)
- thinkphp伪静态实例(thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解)
- php代码最可靠的加密方式(php DES加密算法实例分析)
- phpstudy怎么升级mysql(phpStudy中升级MySQL版本到5.7.17的方法步骤)
- web项目部署到阿里云服务器上(阿里云的WindowsServer2016上部署php+apache)
- thinkphp5 api开发(thinkphp5框架前后端分离项目实现分页功能的方法分析)
- phptime函数与时区设置(php常用日期时间函数实例小结)
- thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)
- php包含哪些(php文件包含的几种方式总结)
- 怎么用php制作图片(PHP压缩图片功能的介绍)
- phpstudy怎么配置php环境(使用phpStudy搭建php环境及安装各种php程序实战教程)
- php和java联系(PHP实现与java 通信的插件使用教程)
- php考试复习题(php+mysql开发的最简单在线题库在线做题系统完整案例)
- php逻辑技巧图解(php版本CKEditor 4和CKFinder安装及配置方法图文教程)
- 学好汉语拼音,从娃娃绕口令抓起,平时还是要多练 收藏好(从娃娃绕口令抓起)
- 仙女们的私藏鲜法大PK 鲜香切块牛肉(仙女们的私藏鲜法大PK)
- 天热没胃口 这道菜开胃又下饭,2个小技巧新手一学就会(这道菜开胃又下饭)
- 指天椒紫苏爆炒牛肉(指天椒紫苏爆炒牛肉)
- 谷雨前,吃牛羊肉别忘了吃河鲜,除湿还清热,加紫苏一炒特解馋(吃牛羊肉别忘了吃河鲜)
- 紫苏牛肉锅里滚一滚,香的鼻子都要掉了(紫苏牛肉锅里滚一滚)
热门推荐
- thinkphp5表单系统(thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例)
- dedecms怎样快速找到图片位置(dede搬家后路径变化批量替换图片路径避免图片不能正常显示)
- python 怎么解析中文(Python中一般处理中文的几种方法)
- pythontkinter详解(python3.6使用tkinter实现弹跳小球游戏)
- js淘宝购物车效果代码(JavaScript实现电商平台商品细节图)
- dedecms标签解析(dedecms按栏目分类搜索功能的实现方法)
- laravel关联模型字段冲突(浅谈laravel中的关联查询with的问题)
- django常用模块(django celery redis使用具体实践)
- python抽奖转盘代码(详解python--模拟轮盘抽奖游戏)
- php网页采集教程交流(PHP实现的抓取小说网站内容功能示例)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9