ob_start在PHP 5.5中不起作用

时间:2014-02-20 19:12:03

标签: php

所以我有这个非常简单的脚本:

echo "lalalaal";
ob_start();
var_dump(headers_sent());
echo "heretoo";
$html = ob_get_contents();
ob_end_clean();
echo $html;

它是从命令行运行的:

php n.php

始终。

我有两台服务器:

  • 我的开发服务器有PHP 5.3.10-1ubuntu3.9和Suhosin-Patch(cli)
  • 我的直播服务器有PHP 5.5.9-1 + sury.org~precision + 1(cli)

我的开发服务器上的输出是:

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标记下,然后是空白行,然后是注释。

4 个答案:

答案 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()功能,以便它可以存储信息在记忆中。[这是你通过将它放在回声之后在你的脚本中犯了错误。]