学习笔记拾遗(二)PHP输出缓冲一些注意点

php中的数据输出:echo语句->user缓冲区->sapi缓冲区->服务器缓冲区->TCP缓冲区->浏览器
ob_flush():刷新用户输出缓冲flush():刷新sapi缓冲。因此想要立即输出内容时,应该先调用ob_flush(),再调用flush() ,因此flush()和ob_flush()刷新的缓冲区层次不同。ob_gzhandler():可以在ob_start()中指定为回调函数,根据浏览器支持的内容编码返回相应的编码数据,不能和output_handler和zlib.output_compression同时使用。

注意点:1. 默认配置下,PHP会创建一个顶层缓冲区。每当调用一次ob_start()会创建一个新缓冲区,新建的缓冲区层次在上一个缓冲区之上,此后输出的内容都会先放到最上面的缓冲区,当此缓冲区满了或单次输出量超过缓冲区大小时,就刷新一次缓冲区,把此缓冲区内容推向上一个缓冲区,ob_end_flush()会将当前缓冲区的内容放到上个缓冲区中并关闭该缓冲区,ob_end_clean()擦除当前缓冲区并关闭该缓冲区。

2. 和消息头输出有关的PHP函数(header(),setcookie(),session_start())使用了sapi_header_op()函数,这个函数只会把内容写入到消息头缓冲区中。然后当你输出内容是,例如使用printf(),这些内容会写入到输出缓冲区(假设只有一个)。当这个输出缓冲区中的内容需要被发送时,PHP会先发送消息头,然后发送消息体。PHP为你搞定了所有的事情。如果你觉得不爽,想自己动手,那你就只有把输出缓冲区禁用掉,除此之外别无他法

3.在nginx中,即使调用了ob_flush()和flush()了,数据还可以被fastcgi缓冲区接收,直到超出缓冲区或脚本结束。另外在nginx配置中开启gzip,即使超出fastcgi_buffers_size,也不会立即发送。

php输出相关配置output_buffering 默认4096字节,设置为0表示不使用缓冲区。implicit_flush 默认关闭,开启时,每有一次输出就会调用一次flush(),有损性能,推荐关闭。output_handler 默认为空
这几个配置不能在运行时设置,因为在运行脚本解释前,输出缓冲区已经建立了,你只能通过编辑php.ini文件或者是在执行PHP程序的时候使用-d选项才能改变它们的值。
zlib.output_compression 开启压缩页面。若请求头中带有Accept-Encoding: gzip或deflate时,响应中会添加Content-Encoding:gzip 或deflate和Vary:Accept-Encoding,可以有效减少传输量。另外,output_handler必须设置为空。开启前:
开启后:
可见,传输量已经减少了,传输量大时,可以减少部分传输时间。
另外也可以在服务器层面开启gzip压缩例如nginx配置: gzip on;gzip_types text/plain text/css application/javascript;gzip_min_length 1k;文本文件压缩率比较可观,图片压缩率比较低,不推荐开启。
另外还可以通过nginx配置fastcgi_cache将动态页面的输出缓存起来参考学习:https://www.cnblogs.com/raobenjun/p/8086051.html 文章来源: 学习笔记拾遗(二)PHP输出缓冲一些注意点

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:学习笔记拾遗(二)PHP输出缓冲一些注意点