PHP输出缓冲与header发送问题详解

如果你在header或cookie函数前发送大量字符到浏览器,就会报headers already sent  错误,以下为说明:

headers_sent()

此函数告诉我们发送header的状态。如果将输出发送到浏览器,则不应使用重定向等header函数。为避免此类错误,我们可以使用headers_sent()函数检查header发送状态。它根据标头的状态返回TRUE或FALSE。当我们执行一个php脚本时,将输出存储到缓冲区中,然后再将其发送到浏览器。但是,这还取决于您的服务器php.ini设置,其中必须打开或关闭输出缓冲区。

output_buffering = Off

现在,由于关闭了输出缓冲,因此所有输出都将发送到浏览器。让我们通过一个例子来学习。

<?Php
echo 'Hello p2hp.com';
echo "<br><br>";
if (!headers_sent()) {
echo " 没有header发送,你可以进行发送header或cookie ";
}else{
echo " Header已经发送,你不能再发送header或cookie了 ";
}
?>

以上代码的输出将取决于你的php.ini设置。对于我们来说,我们的php.ini默认是:

output_buffering     4096     4096

在上面的第一行代码中,我们将输出发送到浏览器,但是仍然得到header_sent()没有发送header,因为缓冲区尚未将输出发送到浏览器。所以我们将得到这样的输出

没有header发送,你可以进行发送header或cookie

因此,要将输出发送到浏览器,我们必须耗尽输出缓冲区的容量。这里是4096。因此,我们将尝试向浏览器发送更多输出以超出限制,然后检查if条件以了解header发送状态。

<?php
for ($i=1; $i<=372; $i++) {
    echo "p2hp.com - ";
}
echo "<br><br>";
if (!headers_sent()) {
    // 没有header发送,你可以进行发送header或cookie //
    echo '没有header发送,你可以进行发送header或cookie';
    // header("HTTP/1.1 301 Moved Permanently");
    // header ("Location: mynewpage1.html");
    exit;
} else {
    // Header已经发送,你不能再发送header或cookie了 //
    echo 'Header已经发送,你不能再发送header或cookie了';
    header("Location: mynewpage1.html");// Warning: Cannot modify header information - headers already sent by xxxxx
}

在上面的代码中,您可以通过增加或减少$ i值来调整for循环。循环数越高,意味着将有更多的数据发布到缓冲区。尝试通过增加$i的最大值来查看headers_sent()在哪里变为TRUE。

我们可以使用flush()强制将缓冲区输出发送到浏览器。但是,这取决于服务器,并且可能会以不同的方式工作。

参考  https://www.plus2net.com/php_tutorial/headers_sent.php

总结

到此这篇关于PHP输出缓冲与header发送问题的文章就介绍到这了,更多相关PHP输出缓冲header发送内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PHP嵌套输出缓冲代码实例

    PHP的输出缓存是可以嵌套的.用ob_get_level()就可以输出嵌套级别. 测试发现在cli和浏览器下输出结果不一样(PHP5.4). 手册说明如下: ob_get_level() will always return 0 inside a destructor. This happens because the garbage collection for output buffers has already done before the destructor is called 想要

  • PHP 输出缓冲控制(Output Control)详解

      php 缓冲简介 其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者所描述现象,本文良心出品,代码都是作者运行过. 当执行输出的时候,比如 echo,print.输出并没有立即送给 web server, 而是将数据写入 php buffer.php output_buffering 机制好处当然提升性能.其实 php 文件最终在浏览器上显示,走过3个缓冲阶段:

  • php缓冲输出实例分析

    本文实例讲述了php缓冲输出用法.分享给大家供大家参考.具体分析如下: ob_start([string output_callback])- 打开输出缓冲区 所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息. ob_end_flush - 结束(发送)输出缓冲区的内容,关闭输出缓冲区 实例代码如下: 复制代码 代码如下: ob_start();          //打开缓冲区 echo "hello world";        //

  • PHP输出缓冲控制Output Control系列函数详解

    概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘.对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会

  • php中ob(Output Buffer 输出缓冲)函数使用方法

    来自:http://bbs.phome.net/ShowThread/?threadid=9247&forumid=2  在PHP编程中,  我们经常会遇到一些直接产生输出的函数,  如passthru(),readfile(),  var_dump()  等.  但有时我们想把这些函数的输出导入到文件中,或者先经过处理再输出,  或者把这些函数的输出作为字符串来处理.    这时我们就要用到  Output  Buffer(输出缓冲)  函数了. 处理输出缓冲的函数主要有这么几个:    ob

  • php 输出缓冲 Output Control用法实例详解

    本文实例讲述了php 输出缓冲 Output Control用法.分享给大家供大家参考,具体如下: 关于php的输出缓冲,首先要说明的是什么是缓冲(buffer),比如我们通过记事本在编辑文件的时候,并不是我们输入了内容,系统就会立刻向磁盘中写入数据.只有我们在保存文件后,系统才会向磁盘写入数据.而之前我们输入的内容全部保存在了文件缓冲区中,只有当缓冲区写满或者执行保存时,数据才会写入磁盘. 而php的输出缓冲也一样,当我们通过echo,print等函数输出时,这些内容首先会保存在output

  • 剖析 PHP 中的输出缓冲

    我们先来看一段代码: 〈?php     for ($i=10; $i〉0; $i--)     {      echo $i;      flush();      sleep(1);     }     ?〉 按照php手册里的说法,该函数将当前为止程序的所有输出发送到用户的浏览器. 上面的这段代码,应该隔一秒钟输出一次$i.但是实际中却不一定是这样.有可能是等了10秒钟后,所有的输出同时呈现出来. 好,我们来改一下这段代码,改成 〈?php     ob_end_clean();//修改部

  • php flush类输出缓冲剖析

    <?php for ($i=10; $i>0; $i--) { echo $i; flush(); sleep(1); } ?> 按照php手册里的说法 该函数将当前为止程序的所有输出发送到用户的浏览器. 上面的这段代码,应该隔一秒钟输出一次$i.但是实际中却不一定是这样.有可能是等了10秒钟后,所有的输出同时呈现出来. 好,我们来改一下这段代码,改成 <?php ob_end_clean();//修改部分 for ($i=10; $i>0; $i--) { echo $i;

  • PHP基础之输出缓冲区基本概念、原理分析

    本文实例讲述了PHP基础之输出缓冲区.分享给大家供大家参考,具体如下: 一.概念 在PHP运行的过程中,可以将会产生输出的函数或操作结果暂时保存在PHP的缓冲区,只有当缓冲区满了.或者PHP运行完毕.或者在必要时候进行输出,才会将数据输出到浏览器,此缓冲数据的区域称为PHP的输出缓冲区(OB). 二.原理 ①使用了缓冲区之后,当执行PHP的时候,如果碰到了echo.print_r之类的会输出数据的代码(实际上许多函数都会产生输出),PHP就会将要输出的数据放到PHP自身的缓冲区,等待输出: ②当

  • PHP中的输出缓冲控制详解

    目录 清除输出 获得输出缓冲区的内容 刷新(输出)缓冲区内容 一些检测函数 使用 ob_start() 的回调函数来进行输出缓冲区的内容替换 添加 URL 重写器 总结 测试代码: 在 PHP 中,我们直接进行 echo . 或者 print_r 的时候,输出的内容就会直接打印出来.但是,在某些情况下,我们并不想直接打印,这个时候就可以使用输出缓冲控制来进行输出打印的控制.当然,这一套功能并不仅限出针对打印的内容,我们还可以做其它一些操作,这个我们放到最后再说. 清除输出 首先,我们先来看看不让

随机推荐