如果有输出,是否无法更改标题?

时间:2014-04-04 14:47:47

标签: php output

根据我的研究,在脚本输出后无法更改标题。 为什么在我编写的代码示例中,脚本在创建新标题之前有几个输出,但一切正常?

<?php
$name = "tommy" ;
?>

<?php 
headers_sent($filename, $linenum) ;
header("name: $name") ;
echo "tommy <br>" ;
echo "Headers  sent in $filename on line $linenum" ;
?>

此外,输出显示标题是在第0行发送的...如果我之后添加了标题,那怎么可能呢?

6 个答案:

答案 0 :(得分:5)

检查php.ini中的输出缓冲是否设置为On。根据php.net上的评论:http://www.php.net/manual/en/ref.outcontrol.php#69059

,某些PHP版本默认情况下也可能是On

如果是这样的话,这可能就是为什么你的脚本没有错误就可以正常执行,即使有&#34;输出&#34;在发送标题之前。

编辑:如果您无法访问php.ini文件本身,您可以通过调用ini_get('output_buffering');来检查PHP脚本中输出缓冲的值。

答案 1 :(得分:2)

在这种情况下,输出意味着向客户端发送信息。可以是echoprint_r或其他形式的屏幕输出信息。

有更多输出数据的方法,例如:设置cookie也会发送输出。您无法设置Cookie并继续更改标题。

代码中的错误: 在第3行,您关闭php ?>并在第5行<?php打开它。输出第4行,\n(换行符)。这会引发错误 如果您没有看到该错误,则您的错误级别可能是错误的。你可以在标题上方做一个回音,如果你仍然没有错误,那就是error_reporting。

答案 2 :(得分:1)

使用    {php}文件第一行的ob_start();

答案 3 :(得分:1)

如果我理解你的问题,那么我请你看一下PHP.ini中output_buffering指令的值。默认值为0,但PHP安装程序通常将其设置为4096(从php.ini-development或php.ini-production复制)。在您的示例中应该是这种情况,即缓冲是开启的。

其次,您的代码示例存在缺陷;它不会检查headers_sent函数返回的值:

bool headers_sent ([ string &$file [, int &$line ]] )

首先检查返回值;如果返回值为true,则认为文件和行参数有效

<?php
$name = "tommy";
?>

<?php
$sent = headers_sent($filename, $linenum);
header("name: $name");
echo "tommy <br>";
if ($sent) {
    echo "Headers sent in $filename on line $linenum";
} else {
    echo "Headers not sent";
}
?>

输出:

tommy
Headers not sent

总结:

  1. 您的代码不会因为输出缓冲打开而失败。
  2. 您认为标题已发送的假设是错误的。

  3. 注意:如果output_buffering设置为4096,那么这将起作用:

    <?php
    echo str_repeat(" ", 4095);
    header("X-Foo: Bar");
    echo ".";
    

    但是这已经失败,标题已经发送错误:

    <?php
    echo str_repeat(" ", 4096);
    header("X-Foo: Bar");
    echo ".";
    

答案 4 :(得分:0)

// -----------------------
ob_start();
// -----------------------

/* Code here */

// -----------------------
$output = ob_get_clean();

if(ob_get_level() > 0)
    ob_end_clean();

echo $output;
// -----------------------

答案 5 :(得分:-1)

确保在您的案例中发送标题之前没有空白符号

<?php
$name = "tommy" ;

?>




<?php 


headers_sent($filename, $linenum) ;
header("name: $name") ;
echo "tommy <br>" ;

echo "Headers  sent in $filename on line $linenum" ;
?>

?><?php之间你有5个可能导致问题的新行字符,如果你将这个文件包含在另一个中,请确保主文件没有任何字符输出高于你的标题命令。