php ob 缓存,php中ob函数缓冲机制深入理解

下面就php中ob函数缓冲机制通过文字说明加代码分析的形式给大家展示如下:

对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的。在他们心目中,一个echo print_r 函数,数据便会‘嗖'的一声飞到浏览器上,显示出来。我也一直如此单纯地认为。 其实,在技术的世界里,向来都是由简单到复杂,也许那些技术开发者开始单纯如你我,但是面对残酷的现实,不得不调整策略,以期提高机器运行效率,最后想到了那些让我们赞叹的idea。

说到缓冲,也就是buffer,这里必须要和缓存做一下比较,单纯地比较定义是无意义的,莫不如看看它们做什么。缓存解决的是如何快速查找利用数据,节省cpu消耗问题,而缓冲解决的是高速cpu与低速I/O设备不匹配的问题。

再说下本文的另一个主角,ob函数,ob是output_buffering的简写。既然ob函数是php扩展函数,那么ob函数主要操作的也就是php buffer了。

简单说完本文两个主角,我们还必须回归开头的主题,echo print_r函数输出的数据是怎么到达浏览器让用户看到的呢?实际上的历程是这样的:

echo、print_r=>php output_buffering=>webServer buffer=>browser buffer=>browser display

我们可以清楚地看到,从echo、print_r函数到发送信息给客户端经历了两个缓冲区,在客户端还经历了一个浏览器缓冲区。我们本文主要讨论的是php output_buffering。

未使用ob函数时缓冲区的使用情况

我们的代码很多时候是根本不使用ob函数的,那么它们使用缓冲区了吗?这要看php设置情况。缓冲区是通过php.ini中的output_buffering变量控制的。其默认值是off,可以设置为on来打开buffer。打来buffer后,即便程序中没有用ob函数,实际上代码也是使用了缓冲区的。另外,不管php.ini中output_buffering的设置,cli模式下的php始终默认是关闭的。

为什么要是缓冲区呢?简单来说,高速的cpu早早处理完自己的数据,想通过线路传递给用户,但是线路太窄了,一下输送不过去。如果引入缓冲区,cpu可以将快速将生成的数据放入缓冲区,然后自己哪儿凉快儿哪儿呆着这歇着去了。缓冲区根据指令适时将数据输出。这个样就合理解决了高速cpu与低速I/O设备的矛盾了。

缓冲区的数据什么时候输出呢?1,当缓冲区满了的时候,缓冲是有容量大小的,到达极限则会自动输出内容。2,脚本执行完毕。很多小程序输出内容没那么多,总不能等到缓冲区满了再输出吧~这一点再自然不过。

使用ob函数时缓冲区的使用情况

ob_start()

打开输出缓冲。这个函数是我们调用最多的一个函数之一。在output_buffering设置为on或者x k的情况下,这个函数与其说是打开输出缓冲,还不如说将输出缓冲扩充到很大。当然在output_buffering设置为off的条件下,ob_start会起到打开buffer的作用。ob_start()还可以传递一个可选参数 output_callback 函数,php官方手册有详细说明。

ob_get_contents()

只是得到输出缓冲区的内容,但不清除它。

ob_end_clean()与ob_clean()

这两个函数从字面意思上就可以看出其区别。前者清除缓冲区内容并且关闭,后者仅仅是做清除工作。需要注意的是,使用了这两个函数,在前面使用了echo、print_r等函数不会输出内容。

笔者曾经试图通过print_r打印出ob_get_contents()的内容,然后调用ob_clean()清除缓冲区,以免影响后面对缓冲区的操作,屡屡失败。仔细想想,print_r的内容再次写入缓冲区,而后面做了ob_clean()的操作,自然不会有任何输出。在ob_clean操作之前调用ob_flush()函数便可达到预想的效果。

ob_flush()与flush()

ob_flush()送出缓冲区的内容并且丢弃内容。因而在此函数之前最好采用ob_get_contents()获得缓冲区内容。flush()刷出服务器端缓冲,并且发往客户端。因而从流程上来说,应该是先调用ob_flush()而后再调用flush函数。

另外说明下再Apache buffer flush()的工作原理:在apache module的sapi下,flush会通过调用sapi_module()的flush成员函数指针,间接使用apache的api::ap_rflush刷新apache的输出缓冲区。当然apache其他模块比如mod_gzip可能改变这个动作的结果,可能自己进行输出缓冲区,这将导致flush()函数产生的结果不会立即被送到客户端浏览器。

ob_get_clean()

如果你已经熟练掌握ob_get_contents()和ob_clean(),那这个函数就很简单了。因为它是前两者的结合体。它主要是得到当前缓冲区的内容并删除当前输出缓冲区。

ob函数还有很多,但大部分用法比较简单,理解较为容易。大家可以参照php手册 ,里面会有详细的解释。本文列出了笔者开始并不是很理解的一些函数,当然今后还会有新的问题出现,想到问题并且解决问题,生活的乐趣也许就在此处吧。

以上内容就是本文针对php中ob函数缓冲机制深入理解,希望对大家今后学习有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php极光推送教程,laravel框架使用极光推送消息操作示例

本文实例讲述了laravel框架使用极光推送消息。分享给大家供大家参考,具体如下:最近需要使用极光推送往客户端推消息,所以这里记录下使用过程。极光推送的服务端文档:https://docs.jiguang.cn/jpush/server/push/server_overview/极…

php 强制刷新,web端实现后退强制刷新功能代码

本文主要和大家介绍了微信web端后退强制刷新功能的实现代码,需要的朋友可以参考下,希望能帮助到大家。具体代码如下所示://生成uuidvar uuidChars "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");fu…

php强制cookies,php Cookies操作类(附源码)

本cookies操作类的功能,包括:1,保存,读取,更新,清除cookies数据。2,可设置前缀。3,强制超时控制。4,cookies数据可以是字符串,数组,对象等。1&…

php 缩略图 失真,WORDPRESS缩略图失真变形模糊的解决方法

众所周知,网站最怕改版,其中一个主要的原因就是缩略图的问题,旧模板的缩略图尺寸不一定适合新版的模板缩略图尺寸要求,尽管后台的设置-多媒体-缩略图尺寸修改了,可这是新上传的图片才会生成新的尺寸的缩略图&#xff0…

php表单 提交数据,PHP表单提交数据

1.PHP表单处理PHP 超全局变量 $_GET 和 $_POST 用于收集表单数据GET 和 POST 都创建数组(例如,array( key > value, key2 > value2, key3 > value3, ...))。此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。…

binarysearch java,java数据结构之二分查找法 binarySearch的实例

java数据结构之二分查找法 binarySearch的实例折半查找法,前提是已经排好序的数组才可查找实例代码:public class BinarySearch {int[] bArr;public void setArr(int[] bArr){this.bArrbArr;}public static void main(String[] args) {int arrLength16;i…

matlab dotline,基于模糊控制的路径规划算法的仿真实现---Matlab程序.rar

【实例简介】与 本人博客中的课程论文《基于模糊控制的路径规划算法的仿真实现》相配套,可以相互参阅【实例截图】【核心代码】基于模糊控制的路径规划算法的仿真实现---Matlab程序├── fuzzy4│ ├── CheckIsBlocked.asv│ ├── CheckIsBlocked.m│ ├…

php重定义地址栏url,thinkphp框架实现路由重定义简化url访问地址的方法分析

本文实例讲述了thinkphp框架实现路由重定义简化url访问地址的方法。分享给大家供大家参考,具体如下:如果按照正常访问的话,则需要输入一长串的url地址,这样会显得十分冗长,我可以可以通过对路由规则的重新定义简化url访…

php 数组 json字段去不全,json_encode – PHP给出了不完整的json字符串

首先我的环境:PHP 5.3.2 – 使用Suoshin和xCache的lighttpd / 1.4.26我的代码太多了,不能在这里发布.我会说出来的.文件x.php正在加载一些PHP – Classe,初始化它们,执行一些函数 – >获取Result数组.如果我print_r这个数组我得到一个完整的结果.但是我使用json_…

java 判断季节,Java-用switch判断季节

import java.util.*;class Demo3{public static void main(String[] args){//需求 :输入一个月份 ,判断月份属于哪一个季节 :春天:3,4,5//夏天 :6,7,8 ,秋天:9,10,11 冬天:12&#x…

matlab jp2格式,JP2文件扩展名_JP2是什么格式_JP2文件怎么打开-文件百科

JPEG 2000标准是由联合图像专家组(JPEG)委员会在1990年代后期开发的,以代替1992年发布的JPEG标准。它对JPEG格式进行了一些改进,采用小波压缩算法,不会产生原先的基于离散余弦变换的JPEG标准产生的块状模糊瑕疵。JPEG 2000使用小波变换、画布…

PPT下载下来是php,用php下载jpg,doc,ppt文件已损坏

我试图用php下载一些文件来隐藏文件路径,但是一些文件类型总是被破坏。像PDF和MP3文件类型很好。像doc,PPT,JPG等文件类型总是下载破碎。我使用这些mimetypesif (file_exists($file_real)){$extension strtolower(substr(strrchr($file, &qu…

php安装文档,PHP - Manual: 安装 (官方文档)

安装安装此 PECL 扩展相关的信息可在手册中标题为PECL扩展的安装章节中找到。更多信息如新的发行版本、下载、源文件、维护人员信息及变更日志等,都在此处: https://pecl.php.net/package/cairo.PECL 扩展的DLL 当前不可用。参见在 Windows 上构建章节。…

php mail laravel,邮件 - Laravel - 为 WEB 艺术家创造的 PHP 框架。

邮件配置Laravel的邮件功能构建于流行的SwiftMailer库之上,并提供了简介、高效的API。邮件配置信息在app/config/mail.php文件中,并提供了包含SMTP主机、端口和证书的配置选项,也可以为发送的邮件配置一个全局from(来自)地址。你可以使用任何…

php抓取带帐号密码,PHP实现抓取迅雷VIP账号的方法_PHP

本文实例讲述了PHP实现抓取迅雷VIP账号的方法。分享给大家供大家参考。具体如下:看了Jinn_Wei Python版本的抓取账号,于是顺手写了个PHP版本PS1:代码没经过优化,只实现了基本的功能PS2:代码中使用了SnoopyPS3&#xff…

php输入安全验证漏洞,PHP 输入验证错误漏洞

来源:MLIST链接:https:/3 N x 6/lists.deC w c F K Y x bian.org/debian-lts-announce/2020/10/msg00008.html来源:MISC链接:http://cS | / O ?ve.circl.lu/cve/CH P / 3VE-2020-8184来源:MISC链接:https:/? 2 ( 4/bugs.php.net/buX / d 2 # } Lg.php?id79699来源:FEDORA链…

oracle 主键约束重名,主键及主键索引的关系及相互影响

主键的定义:列或多列的集合,用于唯一的标识表中的一行。一个表上只允许有一个主键。我们在数据库中指定主键时,是通过主键约束来定义的。而创建主键约束时,又是需要有相应的索引来配合实现的。所以,本文的目的是总结创…

oracle数据库密码复杂度查询,Oracle11g R2创建PASSWORD_VERIFY_FUNCTION对应密码复杂度验证函数步骤...

1、连接上Linux数据库服务器,切换到Oracle数据库用户桌面,打开终端,进入到环境变量$ORACLE_HOME目录Last login: Fri Dec 11 13:26:18 2015 from 192.168.1.100[rootLinux主机名 ~]# su - oracle[oracleLinux主机名 dbhome_1]$ cd $ORACLE_HO…

oracle加大内存对大表,在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能...

在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。以system身份登陆数据库,查看 v$option视图,如果其中Partition为TRUE,则支持分区功能;否则不支持。Partition有基于范围、哈希、综和三种类型。…

php ci框架 模板引擎,详解CodeIgniter框架实现的整合Smarty引擎DEMO

CodeIgniter框架实现的整合Smarty引擎DEMO示例本文实例讲述了CodeIgniter框架实现的整合Smarty引擎。分享给大家供大家参考,具体如下:Smarty的模板机制很强大,一般情况下CI框架无需整合其他模板标签,因为PHP本身就是一种标签&…