做电工的有接单的网站吗,快速做网站的方法,沈阳专业做网站,电话百度下面就php中ob函数缓冲机制通过文字说明加代码分析的形式给大家展示如下#xff1a;对于一个刚刚入门的php程序员来说#xff0c;php缓冲区是几乎透明的。在他们心目中#xff0c;一个echo print_r 函数#xff0c;数据便会‘嗖的一声飞到浏览器上#xff0c;显示出来。我…下面就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_rphp output_bufferingwebServer bufferbrowser bufferbrowser 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的apiap_rflush刷新apache的输出缓冲区。当然apache其他模块比如mod_gzip可能改变这个动作的结果可能自己进行输出缓冲区这将导致flush()函数产生的结果不会立即被送到客户端浏览器。ob_get_clean()如果你已经熟练掌握ob_get_contents()和ob_clean()那这个函数就很简单了。因为它是前两者的结合体。它主要是得到当前缓冲区的内容并删除当前输出缓冲区。ob函数还有很多但大部分用法比较简单理解较为容易。大家可以参照php手册 里面会有详细的解释。本文列出了笔者开始并不是很理解的一些函数当然今后还会有新的问题出现想到问题并且解决问题生活的乐趣也许就在此处吧。以上内容就是本文针对php中ob函数缓冲机制深入理解希望对大家今后学习有所帮助。