【问题标题】:Php 5.4 Cannot modify header information - headers already sentPHP 5.4 无法修改标头信息 - 标头已发送
【发布时间】:2017-01-25 11:22:40
【问题描述】:

最近我在 Ubuntu 12.04 LTS 上如 link 中所述升级到 Php 5.4:-

  1. sudo add-apt-repository ppa:ondrej/php5-oldstable
  2. sudo apt-get update
  3. sudo apt-get dist-upgrade

我的代码没有任何改变。但现在我收到以下错误:-

E_WARNING Cannot modify header information - headers already sent by (output started at Abstract.php:588) in functions.php on line 55

引发错误的相关代码:-

 //Abstract.php
 public function outputBody()
    {
        $body = implode('', $this->_body);
        echo $body; //Line 588
    }
...

// functions.php 
 if ($exit) {
    if (strtolower(PHP_SAPI) != 'cli') {            
       header("HTTP/1.1 500 Internal Server Error"); //Line 55
    }
    echo Bob_Exception_Helper::printException($e, $logStr) . PHP_EOL;
    exit (1);
 }

我在/etc/php5/cli/php.ini/etc/php5/apache2/php.ini 中都添加了以下行,如this 问题中所述

output_buffering = On

在 php 5.3 上一切正常。升级后没有进行任何代码更改。刚升级到 PHP 5.4 后,这个问题就出现了。

php --version
PHP 5.4.45-4+deprecated+dontuse+deb.sury.org~precise+1 (cli) (built: Jun 24 2016 08:30:18) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

抛出错误的php代码:-

public function outputBody()
 {
        $body = implode('', $this->_body);
        echo $body; //As per the warning this line is throwing the error
 }

但仍然出现同样的错误?谁能告诉我如何解决这个问题?

【问题讨论】:

  • 这可能会对你有所帮助 - How to fix “Headers already sent” error in PHP
  • 是的,我已经解决了这个问题。更新了我的问题。
  • 会有一些 PHP 代码产生这个错误 - 通常它在 E_Warning 中引用 - 还有比你发布的更多吗?
  • 更新了问题。

标签: php apache ubuntu


【解决方案1】:

好的,所以您的outputBody() 方法在您的functions.php 文件中的代码之前被调用。

正是这个if语句触发了错误;

if (strtolower(PHP_SAPI) != 'cli') {            
    header("HTTP/1.1 500 Internal Server Error"); //Line 55
}

当您升级 PHP 时,PHP_SAPI 常量的值显然发生了变化。这会触发header() 方法,但因为Abstract.php 中的outputBody() 已经运行并将内容回显到已设置标题的页面。由于发送后无法重置标头,因此您的 header() 方法失败。

查看PHP_SAPI 发生变化的原因以及变化的内容。解决这个问题应该可以解决您的问题。

【讨论】:

    【解决方案2】:

    当已经有输出发生时,您不能修改标题信息。 (例如echo "xyz"; 或在<?php 标签前面的空格)。 如果您向我们展示产生错误的代码,我们也许可以告诉您发生错误的确切位置。

    【讨论】:

    • 更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多