无法解决 "header have already been sent" 错误

Can't solve "header have already been sent" error

我已经安装了 Flarum 并尝试创建我的第一个扩展。我通过根文件夹的 composer.json 和 运行 "composer update" 按照教程和 "required" 我的扩展进行了操作。它出现在我的 Flarum 管理面板中,一旦我启用它,我就在整个网站上遇到了这个错误:

RuntimeException Failed to start the session because headers have already been >sent by "/srv/users/serverpilot/apps/myapplication/public/workbench/flarum-ext-yogi/bootstrap.php" at line 4.

扩展文件夹仅包含两个文件:composer.json 和 bootstrap.php

这是bootstrap.php的内容:

<?php return function () { echo 'Hello world!'; };

这是我的调用堆栈信息:http://i.imgur.com/myayCyt.png

一旦我从 bootstrap.php 中删除 "echo",我的网站就会重新开始工作。我尝试清理我的 cookie 和缓存,但没有帮助。

这可能是什么原因?为什么一个简单的回声会破坏整个网站?

如果你输出类似

的东西
echo 'Hello world!';

之前

`header("something");`

你需要把你的代码放在后面。您可能包含一个包含 header

的页面

好消息

您已经解决了自己的问题,发现问题在 bootstrap.php

解决方案

删除bootstrap.php中的匿名函数。当应用程序仍在加载过程中时,它 echo 的内容。如果您想 echo 在页面上做一些事情,请在应用程序希望您做的正确位置进行。

等等,为什么?

这里有一个原则在起作用。 HTTP内容必须在内容之前有HTTPheaders。由于这个原则,使用echo发送内容,因此也强制PHP发送header随之而来。

有大量关于 'Headers Already Sent' 错误的文档。我只能提供一个快速的解释,以节省您的阅读时间。

基本上,当它检测到您生成了 HTTP 内容时,PHP auto-sends HTTP headers。这正是你 echo 的时候。

这一切都很好,很漂亮,很有帮助。但是许多应用程序喜欢在发送之前对 HTTP header 进行手动更改。

应用程序在文件加载/初始化期间执行此操作。

您跳过了这一步,过早地交付了输出。

进入 Joe Shmoe Web 开发人员

所以一些写得不好的软件过早地使用 echo,它通过强制 PHP 发送带有 echoed 内容的 headers 来搞砸整个事情,但它是申请前要.

因此,当应用程序到达它喜欢进行 header 更改的位置时,PHP 停止应用程序并说 未来的 Whosebug 用户 尝试了 echo 在一切都正确初始化之前(又名。Headers 已发送)。

现实世界的例子

这就像给祖母写了一封信,却没有经过深思熟虑。您将通常的特别版 Brazzers post 邮票放在信封上。然后您对信的内容感到非常满意,以至于您将信合上并丢在 post-office 处。第二天你 return 到办公室对 post-man 说你犯了一个严重的错误,想换信封。 post 办公室会告诉你它已经发送了。你昨天把你的内容寄给了信封。