php输出控制output controll(header, ob_xxx)

关于php的output controll参考文档:

http://gywbd.github.io/posts/2015/1/php-output-buffer-in-deep.html

http://www.cnblogs.com/liuzhang/p/4161213.html

众所周知,调用header()函数之前不能有任何输出到浏览器,否则会报错。

如何复现这种情况:

1、php.ini设置output_buffering OFF

2、测试代码:

echo 2;
header("HTTP/1.1 503 Service Unavailable");

3、这样程序就会报错:

Warning: Cannot modify header information - headers already sent by

如何修复这种错误:

方法1:

php.ini中output_buffering 4096设置一个4K的大小,这样程序的echo就会一直缓存到php(或者缓存到web server ?)直到缓存大小为4K或者调用ob_系列函数才会输出。

这也是下面代码直到sleep 2s后才能显示所有结果的原因:

echo 2;
sleep(2);
echo 3;

方法2:

方法1中output_buffering 4096表示默认php程序开启输出(针对echo printf等函数)缓存(效果等同于ob_start()函数),此时调用ob_get_level()得到的结果是1。

所以可以调用关闭缓存函数来关闭输出缓存

ob_end_clean()或者ob_get_clean()

ob_end_clean();
echo 2;
header("HTTP/1.1 503 Service Unavailable");

这样就会报错了。

但是如下代码也并不会立即输出结果:

ob_get_clean();
echo 2;
sleep(2);
echo 3;

原因应该是ob_函数只关闭了php的输出缓存,而echo的东西依旧存在web server里面被缓存着,也只有等待程序完毕web server才把输出完全发送给浏览器。

如果想要程序echo一个东西浏览器就显示一个,可以如下操作:

echo str_pad(‘‘,4096)."\n";  //这一行很重要,强制使缓冲溢出,4096等于output_buffering 的值
echo 1;

ob_flush();
flush();

sleep(2);
echo 2;

//@todo 未完成,需要重新理一理,还未完全搞懂。flush和ob系列函数有些是控制php缓存的,有些是控制web server缓存的。

时间: 2024-12-16 01:44:28

php输出控制output controll(header, ob_xxx)的相关文章

PHP输出缓冲控制- Output Control 函数应用详解

说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统 是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘.对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会在浏览器上显示. 其实对于PHP程序员来说,基本上每个脚本都涉及到了输出缓冲,只是在大多数情况下,我们都不需要对

SD--如何在输出控制中增加自定义字段

在sap的输出控制中,我们有时需要增加系统未定义的字段作为条件表的字段,为了实现该需求我们就需要修改增强. 输出控制用到的通讯结构 KOMKBK1 (Output Determination Communication Area CAS Appl. K1) KOMKBV1 (Output Determination Communication Area Header Appl. V1) KOMKBV2 (Output Determination Communication Area Header

从CI源码学习PHP高级开发技能——CodeIgniter框架源码深度剖析(4):输出类Output.php

Output类参考说明(摘抄CI手册): 在一般情况下,你可能根本就不会注意到输出类,因为它无需你的干涉, 对你来说完全是透明的.例如,当你使用 加载器 加载一个视图文件时,它会自动传入到输出类,并在系统执行的最后由 CodeIgniter 自动调用.尽管如此,在你需要时,你还是可以对输出进行手工处理. 在说Output类前先说几个知识点和编程技巧: $_SERVER['HTTP_ACCEPT_ENCODING'] .对应请求头是Accept-Encoding:"gzip, deflate&qu

105.输出控制缓存

<?php for ($i = 0; $i < 5; $i++) { echo $i; ob_flush(); //如何开启缓存的话,要加这句话 flush(); sleep(1); } 有了解过PHP缓存输出控制函数的朋友肯定对上面这段代码很熟悉,它想实现的效果是每个1秒输出1个数字,完成全部输出需要10秒,不过实际执行中你会发现奇怪的现象,有些人或者有些时候它的表现如你所愿,而有些人或者有些时候却是10秒后才会一次性输出10个数字.我曾经为此抓狂不已,有朋友留言说这个情况往往是因为IE的缓

cout输出控制——位数和精度控制

刷到一道需要控制输出精度和位数的题目 刚开始以为单纯使用 iomanip 函数库里的 setprecision 就可以,但 OJ 给我判了答案错误,后来一想这样输出并不能限制位数只能限制有效位数. 比如说 0.000101000110 用 setprecision(4) 答案是 0.000101 这里甚至把最后一位的有效数字 0 省略了!! 后来了解到 fixed 关键字 那么在这里若要控制小数点后 N 位 只要写成 cout << fixed << setprecision(N)

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现. I/O 端口具备如下重要特性:    ?? 21 个数字I/O 引脚 ?? 可以配置为通用I/O 或外部设备I/O ?? 输入口具备上拉或下拉能力 ?? 具有外部中断能力. 21 个I/O 引脚都可以用作于外部中断源输入口.因此如果需要外部设备可以产生中断.外部中断

C++ 控制台代码输出控制

在C++控制台应用程序中可以控制控制台输出的字体颜色和 接受任意按键退出 #ifndef CONSOLE_UTILS_H #define CONSOLE_UTILS_H #include <windows.h> #include <conio.h> #include <iostream> //default text colors can be found in wincon.h inline void SetTextColor(WORD colors) { HANDL

unity中Debug输出控制

1 需求: (1)选择在界面.console中输出,并且能够设置保存到文档 (2)控制debug是否输出,可以在debug模式下输出,release模式下不输出 2 参考: 谢谢雨松同学的博客:http://www.xuanyusong.com/archives/2782 , 雨松飞天般的想法实在太奇妙了,虽然我现在还没有理解里面的原理.雨松把debug类常用函数封装在debuger类中,然后通过封装DLL的方式解决Log输出后的定位的问题. 3 方案:   3.1  Dll生成 Debug输出

PHP 输出控制

默认情况下,输出一个字符串到浏览器,经过3个阶段PHP buffer->Tcp buffer->浏览器(IE浏览器有的版本也存在buffer) PHP默认是打开输出缓冲的,在php.ini中可以配置output_buffering=4096(4kb,一个内存页),设置PHP输出缓冲大小 •flush — 刷新输出缓冲(按我的理解是刷新输出TCP bufer)•ob_clean — 清空(擦掉)输出缓冲区•ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲•ob_end_flush