【问题标题】:php flush() triggers headers_sent() even without contentphp flush() 即使没有内容也会触发 headers_sent()
【发布时间】:2014-03-18 13:41:59
【问题描述】:

来自 php 的 headers_sent() 函数在我的目标服务器上不起作用。即使事物被回显,它也不会评估为 True。这可以通过更改 php.ini 中的 output_buffering 值来解决,但不幸的是我没有访问权限。 stackoverflow question 中提到的解决方法是使用 flush() 函数。

但是,当使用 flush() 时,headers_sent() 函数的计算结果始终为 True。这是因为正如 lafor 指出的那样,flush() 将发送标头 + 内容(如果有)。

<?php
flush();
if(headers_sent())
    echo 'headers were sent';
//will output 'headers were sent'

我想使用 headers_sent() 函数来检查是否已经写入/输出了任何内容。 标题本身对我来说并不重要。

谁能帮我检查一下之前是否有输出?

(额外的上下文:我想检查是否有任何函数在执行时间早期执行了 echo() 一些警告消息,当然这些函数可以/应该也执行一些更复杂的错误报告,但这是另一回事)

【问题讨论】:

    标签: php


    【解决方案1】:

    您这样做的目的是什么?多一点解释可能有助于我们将其置于上下文中。

    如果需要输出缓冲,你可以跳过 php.ini 函数,直接使用 ob_start();和 ob_get_clean() 之类的函数;返回内容而不输出。

    【讨论】:

    • 谢谢!我用过:if(strlen(ob_get_contents()) &gt; 0) echo 'content was outputted';
    • 你也可以这样做 if(!empty(ob_get_contents()) echo 'stuff';从技术上讲,它会更快更准确地达到你的目的,但在这种情况下会产生几乎相同的结果。
    【解决方案2】:

    http://us1.php.net/flush 描述了缓冲可能导致输出按预期发送的许多情况。另见http://www.tuxradar.com/practicalphp/13/9/0#null。 flush() 函数应该向浏览器发送“所有内容”,其中包括 HTTP 标头。但是,即使没有其他输出,我也不清楚是否发送了标头。根据您报告的经验,我推测至少对于您的服务器(可能还有浏览器),无论是否有其他输出,标题 都会刷新。

    【讨论】:

    • 是的,你是对的!根据我的测试并由 lafor 的回答确认,无论内容如何,​​都会发送标题。我还可以补充一点,这不受浏览器的影响,因为这将发生在服务器端。
    【解决方案3】:

    当输出缓冲打开时,在输出刷新之前不会发送标头,因此headers_sent() 返回false 之前 这是正确的。 flush() 刷新所有缓冲的内容(如果有)头,所以headers_sent()在这之后返回true也是正确的。我看不出这个功能是如何“不工作”或“无用”的。

    如果您的目的是检查是否有任何标头设置为发送(使用 header() 函数,该函数在没有输出缓冲的情况下也会立即发送标头),您可能想看看进入headers_list() 或使用header_register_callback() 注册自定义回调。

    【讨论】:

    • 你是对的。现在我意识到我正在使用 headers_sent() 来检查是否输出了任何内容。我把它和标题混在一起了。
    猜你喜欢
    • 2019-10-10
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2017-06-15
    相关资源
    最近更新 更多