php--缓冲区

来源:互联网 发布:js判断json是否存在 编辑:程序博客网 时间:2024/04/30 06:09

php输出数据流程
php缓冲区-》Apache缓冲区-》浏览器
1、在php中的作用
1)使用缓冲区避免header在输出数据后使用报错

echo "this is test";header("LOCATION http://www.baidu.com");

header了函数不受缓冲区影响,当碰到header函数是,php会马上至此那个Apache发货该http头到浏览器,儿开启缓冲区后,该数据会存放到缓冲区,等待输出
2)php写 文件下载
php写文件下载页面,可以使文件下载更安全,同时提高更多的可控性,通过fwrite独处文件内容并显示,然后通过header来发送http头,让浏览器知道这是一个附件。
然而,当文件很大时,不开启缓冲区,需要将所有数据全部独处,在一次返回到页面上,用户将会在所有数据读完后才会得要响应,降低用户体验感。
若开启缓冲区,php读完文件某一段后,马上输出到Apache,Apache马上返回到浏览器,从而减少用户等待时间,通过while循环,一直一段一段地读取文件,每读一段,就马上输出,知道全部输出位置。
另外,为了保证服务器的稳定,管理员还会把php的执行内存设一个限制(通过php.ini中的memory_limit,其默认值是8M),也就是每个php程序使用的内存不能超过设置的值,若文件过大,则没有足够内存来读入该文件,所以需开启缓冲区
3)静态文件缓存
静态页面缓存:某一个页面在第一次访问的时候,会执行PHP,然后把显示的内容返回到浏览器,同时把这次显示的内容保存到服务器上,这样下次访问的时候,就直接把保存在服务器上的文件直接显示,而不需要通过PHP来做操作

ob_start();echo 'aaa';$string = ob_get_contents();file_put_contents('a.html', $string);ob_flush();flush();

与输出缓冲区有关的配置
php.ini中
output_buffering – 直接影响php本身的缓冲区,on(开启)、off(关闭)、xk(当缓冲区内容超过x k时,自动刷新缓冲区-把数据发送到Apache)
implicit_flush – 直接影响apache缓冲区,on(自动刷新Apache缓冲区)、off(不自动刷新Apache缓冲区)
与缓冲区有关的函数
ob_implicit_flush – 与 implicit_flush 一样,是否自动刷新Apache的缓冲区
flush – 发送指令到Apache,让Apache刷新自身的输出缓冲区
ob_start – 打开输出缓冲区,不管php.ini中output_buffering怎么设置,也会打开缓冲区,ob_start还接受一个参数(回调),再输入缓冲区内容前,使用调用传递进来的参数把缓冲区的内容处理一次在放入缓冲区内。
ob_flush – 知识php本身刷新自身的缓冲区,把数据发送到Apache
ob_clean – 清除php缓冲区里的内容
ob_end_clean – 清除php缓冲区内的内容,并关闭输出缓冲区
ob_get_clean – 获取缓冲区的内容后,清除缓冲区
ob_end_flush – 把php自身的缓冲区里的内容发送到Apache,并清除自身缓冲区内容
ob_get_contents – 获取输出缓冲区里的内容
ob_get_flush – 获取缓冲区里的内容,并把这些内容发送到apache
ob_get_length – 获取缓冲区里内容的长度
ob_list_handlers – 获取运行ob_start时,所回调的函数名称

ob_start(‘ob_gzhandler’);print_r(ob_list_handlers);

ob_gzhandler – 该函数作为ob_start的回调函数,在缓冲区刷新之前,会调用该函数对数据进行到底gzip或者deflate压缩.这个函数需要zlib扩展的支持.
使用缓冲区的相关内容
1.ob_flush和flush的次序关系.上面的分析可以看出,ob_flush是和php自身相关的,而flush操作的是apache的缓冲区,所有我们在使用这两个函数的时候,需要先执行ob_flush,
再执行flush,因为我们需要先把数据从PHP上发送到apache,然后再由apache返回到浏览器.如果php还没有把数据刷新到apache,就调用了flush,则apache无任何数据返回到浏览器.

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

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

echo str_repeat(" ",4096);

4.在apache中,如果你开启了mod_gzip的压缩模块,这样可能会导致你的flush函数刷新不成功,其原因是,mod_gzip有自己的输出缓冲区,当php执行了flush函数,指示apache刷新输出缓冲区,但是内容需要压缩,apache就把内容输出到自身的mod_gzip模块,mod_gzip也有自身的输出 缓冲区,他也不会马上输出,所以造成了内容不能马上输出.为了改善这个情况,可以关闭mod_gzip模块,或者在httpd.conf增加以下内容,以禁止压缩

参照文档:http://www.cnblogs.com/saw2012/archive/2013/01/30/2882451.html

0 0
原创粉丝点击