最近提交完代码后,发现Firephp在其他人的环境下又出问题了,提示:’Headers already sent in …’,与上一次Nginx 缓冲区超出不太一样。查看Nginx错误日志,并没有发现错误,并且有同学发现Apache下面也会,怀疑是PHP的问题。但是我用的也是Apache,并不会出现问题!偶然发现有一个页面不会出现错误提示,发现该页面输出内容大小在1KB左右,怀疑是PHP的输出缓冲区超出时,自动发送缓冲区数据,导致后续Firephp通过Http header发送调试信息失败了并结束php脚本执行。
注释掉模板渲染后的输出语句,不再提示该错误,确定是php的缓冲输出有问题。比较不同环境下的php.ini,发现output_buffering的值不太一样,我的值是On,而其他人则是默认值4096。
; Output buffering is a mechanism for controlling how much output data ; (excluding headers and cookies) PHP should keep internally before pushing that ; data to the client. If your application's output exceeds this setting, PHP ; will send that data in chunks of roughly the size you specify. ; Turning on this setting and managing its maximum buffer size can yield some ; interesting side-effects depending on your application and web server. ; You may be able to send headers and cookies after you've already sent output ; through print or echo. You also may see performance benefits if your server is ; emitting less packets due to buffered output versus PHP streaming the output ; as it gets it. On production servers, 4096 bytes is a good setting for performance ; reasons. ; Note: Output buffering can also be controlled via Output Buffering Control ; functions. ; Possible Values: ; On = Enabled and buffer is unlimited. (Use with caution) ; Off = Disabled ; Integer = Enables the buffer and sets its maximum size in bytes. ; Note: This directive is hardcoded to Off for the CLI SAPI ; Default Value: Off ; Development Value: 4096 ; Production Value: 4096 ; http://php.net/output-buffering output_buffering = On
根据上面的解释,当output_buffering为On或者4096时,在每次请求里面,当我们使用echo或print的时候,php实际上并不立即输出而是先保存到缓冲区里面去,当达到一定大小(如4KB)或脚本执行结束的时候,再向浏览器输出缓冲区内容并清空。
Http协议传输内容时,先传输响应头,一旦内容开始输出后,响应头不再可以改变。当output_buffering为On时,PHP会将所有的输出缓存起来,等待请求结束时在向浏览器输出内容,故Firephp在最后时刻更改Http响应头仍然不会存在问题,因为此时仍输出任何内容;当output_buffering为4096(或其他固定值)时,每次php缓冲区一满便会向客户端输出,此时已输出内容,响应头不再可以改变,若尝试设置header便会提示:’Headers already sent…’。
做好Webserver的缓冲输出控制,能够带来更好的用户体验,如Facebook、新浪的Bigpipe。
本次的问题排查发现,由于大部分页面的调试信息较多,导致Http响应头较大(远大于4KB,有的达到36KB),所以触发了自动输出机制。解决办法:更改output_buffering为On;在代码里面手动ob_start();更改output_buffering为更大值;减少日志调试信息。
参考链接:
PHP Output Buffering Control
PHP Streaming and Output Buffering Explained
What is output buffering?
php flush
加速PHP的ECHO
BigPipe: Pipelining web pages for high performance
新浪微博的BigPipe后端实现技术分享
BigPipe学习研究
分块传输编码
个人博客原文链接:PHP 输出控制
相关推荐
"PHP 输出控制函数在 CAI 中的应用" PHP 输出控制函数是指在 PHP 编程语言中用于控制输出的函数,这些函数可以控制输出的格式、内容和样式。输出控制函数在计算机辅助教学(CAI)中的应用非常广泛,能够提高教学的...
PHP作为当今流行的脚本语言之一,具有编写简便,执行速度快,扩充性好等...输出控制函数不对使用 header() 或 setcookie() 发送的文件头信息产生影响,只对那些类似于 echo()、print () 和 PHP 代码的数据块有作用。
本文实例为大家分享了php输出控制函数和输出函数生成静态页面的具体代码,供大家参考,具体内容如下 Output Control 函数详解: flush – 刷新输出缓冲 ob_clean – 清空输出缓冲区 ob_end_clean – 清空缓冲区并...
### PHP输出控制学习笔记 #### 一、简介与应用场景 PHP 的输出控制功能主要用于管理和缓存脚本的输出。在 PHP 脚本执行过程中,可能会遇到需要在发送 HTTP 头信息(例如通过 `header()` 或 `setcookie()` 函数)...
老生长谈了。...#控制隐式缓冲泻出,默认off,打开时,对每个 print/echo 或者输出命令的结果都发送到浏览器。 ob_implicit_flush(1); 例, 复制代码 代码如下: ob_end_clean(); ob_implicit_flush
PHP输出控制灵活,可以在HTML中嵌入PHP代码,也可以由PHP输出HTML语言,或者在命令行下执行,将结果输出到其他设备。 PHP支持模板,实现程序逻辑与用户界面分离 跨平台 与多个服务器兼容,包括Apache MicroSoft ...
三、方法2:使用PHP输出控制函数(Output Control)生成静态页面 输出控制函数允许我们捕获PHP脚本的输出,然后保存为文件。常见的输出控制函数有`ob_start()`、`ob_get_contents()`和`ob_end_clean()`等。流程如下...
PHP4 新函数集锦——输出信息控制函数 PHP4 新函数集锦——输出信息控制函数是 PHP4 中的一组新的函数集锦,旨在提供更好的输出信息控制功能。这些函数可以帮助开发者更好地控制脚本的输出信息,使其更加灵活和可靠...
综合来看,对PHP输出进行缓存并压缩动态页面涉及了多方面的技术,包括输出控制、HTTP头部处理、内容压缩算法等。合理运用这些技术,对于提高网站性能、改善用户体验具有重要的意义。在实际开发中,应根据具体应用...
首先,`ob`系列函数是PHP输出控制函数,用于处理页面生成过程中的输出。`ob_start()`是页面缓存的起始标记,从这个函数调用后,所有输出的内容都将被保存在内存中,而不是立即发送到浏览器。`ob_get_contents()`可以...
### PHP格式化输出函数:深入理解与应用 在PHP编程中,格式化输出函数是开发者进行调试、数据展示以及信息处理的重要工具。本文将详细解析一个典型的PHP格式化输出函数,探讨其工作原理、参数配置及其应用场景,...
这些函数主要用于操作输出缓冲区,可以方便地控制PHP脚本的输出流程。下面是一个简单的示例,展示了如何使用`ob_start()`、`ob_get_contents()`等函数生成静态页面: ```php <?php ob_start(); echo "Hello World!...
主要介绍了PHP输出缓冲控制Output Control系列函数详解,本文讲解了输出缓冲的简介、输出缓冲的作用、php.ini 中的相关配置项、Output Control 函数详解等内容,需要的朋友可以参考下
通过优化代码结构、利用PHP的输出控制函数和调整服务器配置,可以有效地避免这种问题,提高页面的显示质量。在实践中,开发者应该养成良好的编程习惯,避免在代码中留有不必要的空白,从而提高代码的可读性和性能。
8. 深入理解PHP输出控制函数 为了更加灵活地控制输出内容,PHP还提供了ob_implicit_flush()来控制输出缓冲的行为,ob_flush()来刷新输出缓冲区的内容到下一个输出缓冲区或输出目的地,以及ob_get_level()来获取当前...
在PHP编程中,输出函数是我们在日常开发中...在进行复杂数据类型的调试或需要精确控制输出格式时,选择`print_r`、`var_dump`、`printf`和`sprintf`会更加合适。而在追求效率和简洁性时,`echo`和`print`是更好的选择。
PHP 输出掌握的学习笔记主要涉及如何使用PHP的输出控制函数,如`ob_start()`,`ob_get_contents()`,`ob_end_clean()`等,以管理和处理脚本的输出内容。这些函数在处理HTTP头信息、错误处理、内容缓存等方面非常有用...
这段代码中,外层循环控制行数,内层循环控制列数,通过Response.Write()函数将乘法表的内容写入HTML。CSS样式用于美化表格,包括设置边框、内边距和合并单元格。 接下来,我们来看PHP的实现。PHP是一种开放源代码...
1. **硬件接口**:首先,你需要一个能与PHP通信的硬件接口,比如GPIO(通用输入/输出)接口,或者通过USB或串口连接的特定LED控制器。例如,对于树莓派这样的单板计算机,你可以利用其GPIO引脚直接控制LED,或者使用...