无法解决"标头已被发送"错误

时间:2016-06-17 07:00:26

标签: php symfony laravel content-management-system

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

  

RuntimeException由于标头有,因此无法启动会话   已经被>发送了   " /srv/users/serverpilot/apps/myapplication/public/workbench/flarum-ext-yogi/bootstrap.php"在第4行。

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

这是bootstrap.php的内容:

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

这是我的callstack信息:http://i.imgur.com/myayCyt.png

一旦我删除&#34; echo&#34;从bootstrap.php我的网站再次开始工作。我尝试清理我的cookie和缓存,但它没有帮助。

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

2 个答案:

答案 0 :(得分:0)

如果您输出类似

的内容
echo 'Hello world!';

之前

`header("something");`

您需要将代码放在后面。您可能包含一个包含标题

的页面

答案 1 :(得分:0)

好消息

您已经通过bootstrap.php找到问题解决了自己的问题。

解决方案

删除bootstrap.php中的匿名函数。当应用程序仍在加载过程中时,它是echo的内容。如果您想在页面上echo进行某些操作,请在正确的位置进行操作,应用程序需要您这样做。

等等,但为什么?

这里有一个原则。 HTTP内容必须在内容之前包含HTTP标头。由于这一原则,使用echo发送内容,因此也会强制PHP随之发送标头。

有很多关于已经发送的标题的文档&#39;错误。我只能提供快速解释,以节省您的阅读时间。

基本上,PHP会在检测到您生成HTTP内容时自动发送HTTP标头。这正是你echo的时候。

这一切都很好,花花公子,乐于助人。但许多应用程序喜欢在发送之前手动更改HTTP标头。

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

您跳过此步骤并过早提供输出。

输入Joe Shmoe Web Developer

因此,一些编写得不好的软件过早使用echo,它会强制PHP通过强制PHP发送带有echo ed内容的标题,而不是在应用程序需要之前。

因此,当应用程序到达它想要更改标头的位置时,PHP会停止应用程序,并说明未来的stackoverflow用户在所有内容都已正确初始化之前尝试echo(也就是说。标题已经发送)。

真实世界示例

这就像写信给你的祖母一直没有想到的那样。您将通常的特别版Brazzers邮戳放在信封上。然后,你对你的信中的内容感到非常满意,你把它舔掉了,放在邮局。第二天你回到办公室,对那个后人说你犯了一个可怕的错误,想要改变你的信封。邮局会告诉你它已经发送过了。您昨天发送了信封并附上了您的内容。