设为首页 - 加入收藏
广告 1000x90
您的当前位置:144177黄大仙有求必应 > 静态缓冲区 > 正文

php缓冲区详解

来源:未知 编辑:admin 时间:2019-05-31

  简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料.

  其实缓冲区最本质的作用就是,协调高速CPU和相对缓慢的IO设备(磁盘等)的运作.

  想要了解PHP的缓冲区,就要知道执行PHP的时候,缓冲区被设置到了什么地方.

  当执行PHP的时候,如果碰到了echo print_r之类的会输出数据的代码,PHP就会将要输出的数据放到PHP自身的缓冲区,等待输出.

  当PHP自身的缓冲区接到指令,指示要输出缓冲区的内容时,将会把缓冲区内的数据输出到apache上, apache接受到PHP输出的数据,然后再把该数据存在到apache自身的缓冲区内,等到输出

  当apache接受到指令,只是要输出缓冲区的内容时, 将会把缓冲区的内容输出,返回到浏览器.

  由此可见,PHP要输出数据的时候,将会经过两个缓冲区(先是自身的,然后是apache的),再返回到浏览器.

  出现这个错误的原因是, 在header之前已经输出了某些数据,而输出这些数据的同时, apache将会同时发送一个响应状态到浏览器上(既然有输出,即这个请求是有效的),而其后你又再次使用header函数

  发送http头,则会返回这个错误,错误的意思是:HTTP头已经发送出去了,你不能对他再做修改.

  因为header函数是不受缓冲区影响的,当一碰到header函数的时候,PHP马上执行apache发送这一个http头都浏览器.

  而输出的数据PHP打开输出缓冲区后, 这些数据将会存放在缓冲区,等待输出.这样就可以避免了之前所发生的错误.

  为了让文件下载更安全,同时提高更多的可控性,很多朋友都喜欢用PHP写文件下载页面.其原理很简单,就是通过fwrite把文件内容读出并显示,然后通过header来发送HTTP头,让浏览器知道这是一个附件,这样

  如果用上面的办法提供下载页面,会碰到一个效率问题,如果一个文件很大,假设为100M,那么在不开启缓冲区输出的情况下,必须要把100M数据全部读出,然后一次返回到页面上,如果这样做,用户将会在所有数据读完

  如果开启了输出缓冲区,当PHP程序读完文件的某一段,然后马上输出到apache,然后让apache马上返回到浏览器,这样就可以减少用户等待时间.那后面的数据怎么办呢?我们可以写一个while循环,一直一段一段地读取文件

  每读一段,就马上输出,直到把文件全部输出为止,这样浏览器就可以持续地接受到数据,而不必等到所有文件读取完毕.

  另外,该做法还解决了另外一个很严重的问题.例如一个文件是100M,如果不开启缓冲区的情况下,则需要把100M文件全部读入内存,然后再输出.但是,如果PHP程序做了内存限制呢?为了保证服务器的稳定,管理员通常会把PHP的执行

  内存设一个限制(通过总的memory_limit, 其默认值是8M), 也就是每个PHP程序使用的内存不能使用超过这个值的内存. 假设该值为8M,而要读入的文件是100M,根本就没有足够的内存来读入该文件.这个时候,我们就需要用到上面的

  现在很多公司有这么一个需求, 就是某一个页面在第一次访问的时候,会执行PHP,然后把显示的内容返回到浏览器,同时需要把这次显示的内容保存到服务器上,这样下次访问的时候,就直接把保存在服务器上的文件直接显示,而不需要通过PHP来做操作

  这就是所谓的”静态页面缓存”.那怎么样才能做到把内容返回到浏览器的同时把数据保存到服务器上呢?这就要用到输出缓冲区了.

  该配置直接影响的是php本身的缓冲区,有3种配置参数.on/off/xK(x为某个整型数值);

  256k    - 开启缓冲区,而且当缓冲区的内容超过256k的时候,自动刷新缓冲区(把数据发送到apache);

  on    - 自动刷新apache缓冲区,也就是,当php发送数据到apache的缓冲区的时候,不需要等待其他指令,直接就把输出返回到浏览器

  off    - 不自动刷新apache缓冲区,接受到数据后,等待刷新指令

  打开输出缓冲区,无论php.ini的文件如何配置,如果使用该函数,即使output_buffering设置成off,也会打开输出缓冲区

  ob_start函数还接受一个参数,该参数是一个函数的回调,意思是,在输入缓冲区内容之前,需要使用调用传递进来的参数把缓冲区的内容处理一次,再放入缓冲区内

  把php自身的缓冲区里的内容发送到apache,并把清除自身缓冲区内的内容

  该函数的作用是作为ob_start的回调参数, 在缓冲区刷新之前,会调用该函数对数据进行到底gzip或者deflate压缩.这个函数需要zlib扩展的支持.

  再执行flush,因为我们需要先把数据从PHP上发送到apache,然后再由apache返回到浏览器.如果php还没有把数据刷新到apache,就调用了flush,则apache无任何数据返回到浏览器.

  2.有的浏览器,如果接受到的字符太少,则不会把数据显示出来,例如老版的IE(必须要大于256k才显示).这样就会造成一个疑问, 明明在php和apache都进行了刷新缓冲区的操作,但是浏览器就是没有出现自己想要的数据,也许就是这个原因造成的.所以才测试的时候,可以在输出数 据的后面加上多个空格,以填满数据,确定不会浏览器造成这类诡异的问题.

  3.有些webserver,他自身的输出缓冲区会有一些限制,比如nginx,他有一个配置fastcgi_buffer_size 4k, 就是是表明,当自身的输出缓冲区的内容达到4K才会刷新,所以为了保证内容的数据,可以添加以下代码,保证内容长度

  最近在阅读ThinkPHP5.0源码的时候,看到代码: 从注释明白功能要申请一块比较大的buffer,但是为什么新申请的就比较大,原来的就小呢?小有什么关系吗?因此着重学习下ob_*系列的函数,想要深...博文来自:dobat的博客

  PHP缓冲区是默认开启的,它的默认参数在配置文件中,值是4096字节。在其中找到output_buffering配置参数来修改PHP缓冲区的大小。开发者也可以在脚本中通过ob_start...博文来自:杨森源的博客

  前言:在PHP运行的过程中,可以将会产生输出的函数或操作结果暂时保存在PHP的缓冲区,只有当缓冲区满了、或者PHP运行完毕、或者在必要时候进行输出,才会将数据输出到浏览器,此缓冲数据的区域称为PHP的...博文来自:dream_successor的专栏

  简介说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西。举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer...博文来自:森森

  1、全页面静态化缓存:将页面全部生成为HTML静态页面,用户访问时直接访问静态页面,不走PHP服务器的解析流程。此种方式在CMS系统中比较常见,如dedecms。实现方法:输出缓存ob_start()...博文来自:ym_diver的博客

  以下内容是看了别人的讲解和自己调试后对php缓冲的一些理解。代码来自打开一个输出...博文来自:标子 的专栏

  对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些!!用一般的文件操作方法完全没有问题。但如果并发高,在我们对文件进行读写操作时,很有可能多个进程对进一文件进行操作,如果这时不对文件的访问进行...博文来自:萧刚

  1、全页面静态化缓存也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms;一种比较常用的实现方式是...博文来自:辣椒炒辣椒

  这篇文章是翻译自JulienPauli的博客文章PHPoutputbufferindeep,Julien是PHP源码的资深开发和维护人员。这篇文章从多个方面讲解了PHP中的输出缓冲区以及怎么使用它。输...博文来自:的博客

  PHP在执行的时候,在什么地方有用到缓冲区?想要了解PHP的缓冲区,就要知道执行PHP的时候,缓冲区被设置到了什么地方.当执行PHP的时候,如果碰到了echoprint_r之类的会输出数据的代码,PH...博文来自:韩会强的博客

  PHP缓存技术的使用技巧分享PHP缓存技术的应用时相当普遍的,也许有些人还对这项技术不太了解,我们现在就为大家详细的介绍一下PHP缓存技术的相关应用技巧。在大部份情况下我们的网站都会使用数据库作为...博文来自:海阔天空

  缓冲区控制的相关函数简介:1、Flush:输出缓冲区内的内容并且删除缓冲区。 函数格式:flush() 说明:这个函数经常使用,效率很高。 2、ob_start:打开输出缓冲区 函数格式:voidob...博文来自:TimHee

  挖坑,等有空进行测试之后编写博文来自:不要10000小时,先从1000小时开始!

  什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料.其实缓冲区最本质的作用就是,协调...博文来自:phpduang的博客

  前几天碰到jbd2进程占用大量的磁盘io,用iotop查看到的情况大致如下:系统版本:CentOS6.5-64bit    经查为ext4文件系统的一个bug:    先给出解决方案,处理此问题的优...博文来自:enchanterblue的专栏

  提升磁盘IO性能的几个技巧目前磁盘都是机械方...博文来自:dliang27的专栏

  经常弄混ob_*系列的函数用法。记住下面几个应该够用了。ob_start()  //打开输出缓冲区,所有来自PHP程序的非文件头信息都不会发送,而是保存在内部缓冲区。ob_get_contents()...博文

  缓冲区缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,...博文来自:我的大学

  APC,全称是AlternativePHPCache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。APC的缓存分两部分:系统缓存和用户数据缓存。(LinuxAPC扩展...博文来自:稻草人技术博客

  PHP输出缓冲(一)--缓冲区原理博文来自:fwkjdaghappy1的专栏

  我理解的要点:1、所有缓冲区控制是在一个PHP执行进程中发生的。如:你打开n个demo.php,他们之间开启和关闭缓冲是互不影响的。2、output_buffering在程序中用ini_set是不能生...博文来自:程序老兵的博客

  关于PHP缓冲区的一些资料收集。介绍一般性的用法,还有示例。博文来自:wide288 的短文

  之前转了一篇关于php输出缓冲控制的文章:用来方便之后查看的。对于内容的例子代码也没有一一测试,...博文来自:christieheli的专栏

  流(stream)是一个很抽象的概念,《C程序设计语言》中这样定义:流与磁盘或其它外围设备关联的数据的源或目的地。在Unix/Linux中,文本流和二进制流是相同的,但在Windows中,稍有差异,所...博文来自:/dev/null

  1、首先,我们看一下这段代码:它的简单意思就是从键盘读入一个字符,然后输出到屏幕。理所当然,我们输入1,输出就是1,输入2,输出就是2。那么我们如果输出的是12呢?它的输出是1。这里我们先简单的解释下...博文来自:lws123253的博客

  下面就php中ob函数缓冲机制通过文字说明加代码分析的形式给大家展示如下:对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的。在他们心目中,一个echoprint_r函数,数据便会‘嗖的一...博文来自:weixin_41282397的博客

  什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料.其实缓冲区最本质的作用就是,协调...博文来自:的博客

  缓冲区有时也被称作缓存,和手机app中存在的缓存类似,它存在的目的也为了提高效率。c语言在对一个文件进行操作的时候,先将文件读取到缓冲区,然后对文件的操作都在缓冲区进行,操作完成了之后才将文件写入磁盘...博文来自:尹傲雄的博客

  缓冲区的作用就是把输入或者输出的内容先放进内存,而不显示或者读取。4096bytes没达到4096bytes或者脚本结束,输出是不会被发送出去的。缓冲区的作用为了让文件下载更安全,同时提高更多的可控性...博文来自:weiheli的博客

  什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料.其实缓冲区最本质的作用就是,协调...博文来自:逍遥侯之水流云的博客

  什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,其实缓冲区最本质的作用就是,协调高速CPU和相对缓慢的IO设备(...博文来自:jason1993as的博客

  缓冲区是包在一个对象内的基本数据元素数组,Buffer类相比一个简单的数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。Buffer的属性容量(capacity):缓冲区能够容纳的数据元...博文来自:路漫漫,水迢迢

  /*缓冲区对象BufferedWriter缓冲区的出现是为了提高流的操作效率而出现的在创建缓冲区之前,必须要先有流对象。该缓冲区中提供了一个跨平台的换行符。newLine();*/classBuffe...博文来自:blacop的博客

  一、前言最近由于研究需要,要用到线性判别分析(LDA)。于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然开...博文来自:jnulzl的专栏

  相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...博文来自:杨威的博客

  reids是一个key-value存储系统,为了保证效率,缓存在内存中,但是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,以保证数据的持久化。   所以:redis是一...博文来自:那么好,

  在网上所搜索很多操作Word的都是用VC,VS2010做了一些修改,添加操作的方式和用法都有所变化。 要操作Word必须先添加对应的类,如下图在工程中添加操作类(TypeLib中的 MFC类): ...博文来自:xiangjianbo127的专栏

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  前面一直跑caffe下的fcn,同时上一篇博客,也说明了关于fcn的数据集的制作。但是过程还是显的很复杂,因为我们都是模仿作者的数据集而作,而作者为了完成多任务,数据集制作的略显复杂,比如还需用到.m...博文来自:supe_king的博客

  又是一个愉快的夜晚 还是那张长长的工作桌 哲哲在左边做一个香云纱手包 骨头在这里噼里啪啦的解刨 pad里放着《赢在中国》 桌子中间各种饮料、奶、水果... 进击吧~骨头~ 首先感谢Androi...博文

  给定空间三角形的三个顶点(a, b, c)博文来自:qingqingluguo的专栏

  目前市场上比较多的应用在用户卸载后会弹出意见反馈界面,比如360手机卫士,腾讯手机管家,应用宝等等,虽然本人不太认同其交互方式,但是在技术实现上还是可以稍微研究下的。其实要实现这个功能,最主要的就是监...博文

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  前言: 本文主要讨论如何判断整型相加溢出(overflow)的问题. 我们知道计算机里面整型一般是有限个字节(4 bytes for int)表示, 正是因为只能用有限个字节表示一个整型变量, ...博文来自:roaylchen的博客

  此处仅以VS2010为例,详细说明一下如何在VS环境下生成和使用C++的静态库与动态库。Qt下生成和使用静态和动态库后续再讲。 本文仅供初学者参考,如果有问题欢迎大家指正。        首先简单地理...博文来自:luyan的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  最近在用yolo来做视频中的人员检测,选择YOLO是从速度考虑,在训练数据集的过程中碰到很多坑,并且现在yolo又到了v2的版本,在网络和命令中都有区别...博文来自:ch_liu23的博客

  花了几天,终于把matlab版的人脸检测运行成功了,虽然正确率不是很高,看着各种论文上的人脸检测正确率都出奇的高,我是不怎么相信的,有的论文连基于平均脸的人脸检测正确率都能达到98%,汗啊~~  也许...博文来自:海海人生

  相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换...博文来自:生活没有if-else

  在MATLAB中,可以注释一段程序。 使用“%{”和“%}”。 例如 %{ 。。。 %} 即可。 经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 ...博文来自:知识小屋

本文链接:http://that-a-way.com/jingtaihuanchongqu/130.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top