所以我有这个非常简单的脚本:
echo "lalalaal";
ob_start();
var_dump(headers_sent());
echo "heretoo";
$html = ob_get_contents();
ob_end_clean();
echo $html;
它是从命令行运行的:
php n.php
始终。
我有两台服务器:
我的开发服务器上的输出是:
lalalaal
bool(false)
heretoo
在我的实时服务器上:
lalalaal
bool(true)
heretoou
我在两台服务器上显示所有错误,为什么我的实时服务器返回true
?自5.3以来发生了什么变化?
使用var_dumping来自headers_sent的结果它只是告诉我lalalaal导致它:
lalalaalbool(true)
string(18) "/home/ubuntu/n.php"
int(4)
int(4)
指向echo "lalalaal";
,因为它位于PHP标记下,然后是空白行,然后是注释。
答案 0 :(得分:9)
使用网络服务器时,PHP会首先向浏览器发送标题信息。 PHP发送它的头信息的提示是第一次使用输出缓冲区。首次将某些内容放入输出缓冲区时会发送标题信息,并且此时通常没有回头。
这里的混乱来自于您使用CLI的事实。 CLI在PHP 5.4.0之前没有使用与头相关的函数,因为它纯粹是一个命令行工具 - 因此它不受服务器特定或浏览器相关行为的约束。但是,5.4.0及更高版本中的CLI具有内置Web服务器cli-server。
在5.4.0之前,您对CLI模式中的标头有不同的规则,因为它不是为处理或确认标头而构建的,因此headers_sent()
无论如何都会返回false。这不是5.4.0及更高版本的情况,包括5.5。
如果希望CLI脚本在5.3和5.5中按预期工作,则需要遵循有关标头和输出缓冲区的常规准则。
答案 1 :(得分:6)
在您向客户端回复'lalalaal'后,您正在发送标题('e')。
答案 2 :(得分:1)
试试这个
<?php
ob_start(); /* first line, without empty space */
echo "lalalaal";
var_dump(headers_sent());
echo "heretoo";
$html = ob_get_contents();
ob_end_clean();
?>
答案 3 :(得分:-1)
ob_start()用于存储您将在用户浏览器中显示的内容。它用作 BUFFER 存储。
EX 1:采取以下示例:
<?php
echo "hi";
header("As you have already displayed "hi", this info will not be sent.);
?>
EX 2: [实际使用 ob_start ]
在下面的代码中,标题函数将起作用,因为echo信息将存储在缓冲区内存中。
<?php
ob_start();
echo "hi";
echo "Hello"
header("This info will be sent");
ob_end_flush();
?>
注意:虽然您必须采取一项预防措施,但您必须在脚本开头添加 ob_start()功能,以便它可以存储信息在记忆中。[这是你通过将它放在回声之后在你的脚本中犯了错误。]