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

use*_*621 5 php output

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

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

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

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

Sal*_*n A 1

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

其次,你的代码示例有一个缺陷;它不检查函数返回的值headers_sent

bool headers_sent ([ string &$file [, int &$line ]] )
Run Code Online (Sandbox Code Playgroud)

先检查返回值;如果返回值为 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";
}
?>
Run Code Online (Sandbox Code Playgroud)

输出:

bool headers_sent ([ string &$file [, int &$line ]] )
Run Code Online (Sandbox Code Playgroud)

总之:

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

注意:如果output_buffering设置为4096,那么这有效:

<?php
echo str_repeat(" ", 4095);
header("X-Foo: Bar");
echo ".";
Run Code Online (Sandbox Code Playgroud)

但这会失败,并出现标头已发送错误:

<?php
echo str_repeat(" ", 4096);
header("X-Foo: Bar");
echo ".";
Run Code Online (Sandbox Code Playgroud)