【问题标题】:Headers already sent?... Where? [duplicate]标头已经发送?...在​​哪里? [复制]
【发布时间】:2013-01-15 06:27:23
【问题描述】:

可能重复:
Headers already sent by PHP

我的日志文件中不断出现此错误:

[15-Jan-2013 00:50:04] PHP Warning:  Cannot modify header information - headers already sent by (output started at /home/usr/public_html/display.php:1) in /home/usr/public_html/display.php on line 17

所以我查看了第一行的页面,我没有看到任何可能发送标题的地方。

display.php:

<?PHP
require './err/errhandler.php';
require './assets/display.php';
require './assets/excrate.php';

$mysql_host = "sqlhost";
$mysql_database = "db";
$mysql_user = "user";
$mysql_password = "password";

$name = $_REQUEST["q"];
$type = $_GET["s"];
$timeperiod = $_POST["tp"];
$currency = $_POST["c"];

if(isset($currency)){
    setcookie("prefCur", $currency, time()+60*60*24*30*12, "/");
    $_COOKIE["prefCur"] = $currency;
} else {
    if(!isset($_COOKIE["prefCur"])){
        setcookie("prefCur", "usd", time()+60*60*24*30*12, "/");
        $_COOKIE["prefCur"] = "usd";
    }
}
...

errhandler.php:

<?PHP
ini_set('display_errors', false);
ini_set('log_errors', true);
ini_set('error_log', dirname(__FILE__) . '/_err.log');
ini_set('output_buffering', 'on');

display.php:

<?PHP
function strip_name($name)
{
    return preg_replace('/\s\([a-zA-Z 0-9]*\)/', '', preg_replace('/[0-9%]+\s/', '', str_replace(":", "", str_replace("-H", "-h", $name))));
}

excrate.php:

<?PHP $eur = 0.747807; $gbp = 0.621828; $rub = 30.227148;

然后我想知道是不是我的主机附加了一个 php 文件,所以将我的 htaccess 更改为:

php_value auto_prepend_file none
php_value auto_append_file none
Options +FollowSymLinks
...

我仍然收到声称标头已发送的错误消息。我现在很难过。第一行的标头在哪里发送?我什至无法启用输出缓冲,因为它在第一行!

编辑:&lt;?PHP 之前绝对没有任何内容,即使打开输出缓冲,它也不起作用。它只是从第 17 行下移到第 18 行。

【问题讨论】:

  • 你其他文件的内容是什么?
  • $_COOKIE["prefCur"] = $currency; 是有效的代码吗?
  • 你的 php 之前甚至没有空格或换行符?甚至是普通的html?特别是在您的包含文件中?
  • 所需文件有输出代码吗?还是空格?
  • 检查所有包含的文件中是否存在 UTF-8 BOM。

标签: php http-headers output-buffering


【解决方案1】:

简单的把这段代码写在文件的顶部

ob_start();

【讨论】:

  • 试过了。我在 errhandler.php 中设置:&lt;?PHP ini_set('display_errors', false); ini_set('log_errors', true); ini_set('output_buffering', 'on');
  • 你还需要结束输出缓冲ob_end_flush();检查这个what is output buffering?
  • @NullPointer,不一定。输出缓冲区将在 php 执行结束时自行刷新。不过,ob_end_flush() 是控制它的好方法。
  • 是的,我知道。我尝试过,就像我一样:a)启用输出缓冲,b)也通过 ob_start() 手动完成
【解决方案2】:

删除对setcookie() 的调用并检查输出。仅仅向它抛出输出缓冲并不总是最好的选择。如果您包含的任何文件输出任何内容或您调用的任何函数抛出任何警告/通知,则构成设置的标头。

再次,删除setcookie() 并从那里开始。从外部进一步诊断是猜测。 :)

【讨论】:

  • 如何检查输出?
  • 测试页面时在浏览器中。重要的是要向后剥洋葱层,直到发现问题为止。如果您删除setcookie() 并看到没有可见的输出,我们可以推测我们正在处理一个流氓空间。
  • 哦,我通过创建另一个页面 test.php 进行了尝试,除了 OP 中显示的内容之外什么都没有,并且在标题中没有返回任何内容(没有空格,什么都没有)。那么流氓空间会在哪里?
  • 所以,为了清楚起见,当您删除 setcookie() 时,您看不到任何可见的输出?但是,当您添加 setcookie() 回来时,您会收到有关已发送标头的错误?
  • 是的。最后我无法弄清楚并与我的主机发送了一张票,他们在全局 php.ini 中启用了输出缓冲
【解决方案3】:

正如 OP 所说,他的要求没有结束标签,所以在每个要求的末尾添加 ?&gt;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2023-03-23
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多