“处理另一个错误时发生错误:yii\web\HeadersAlreadySentException”

2022-08-30 23:07:52

我正在尝试对基于 Yii 2 框架的留言簿应用程序发表评论。在我的PC上的localhost上工作一切正常,但是在共享主机上,当我想在View中提交评论时,我收到此错误。

这是错误:

An error occurred while handling another error:
    exception 'yii\web\HeadersAlreadySentException' with message 'Headers already sent in /home/mahdikas/public_html/guestbook/controllers/PostController.php on line 117.' in /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/Response.php:366
    Stack trace:
    #0 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
    #1 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/ErrorHandler.php(135): yii\web\Response->send()
    #2 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/base/ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\HeadersAlreadySentException))
    #3 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\HeadersAlreadySentException))
    #4 {main}
    Previous exception:
    exception 'yii\web\HeadersAlreadySentException' with message 'Headers already sent in /home/mahdikas/public_html/guestbook/controllers/PostController.php on line 117.' in /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/Response.php:366
    Stack trace:
    #0 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
    #1 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/base/Application.php(392): yii\web\Response->send()
    #2 /home/mahdikas/public_html/guestbook/web/index.php(12): yii\base\Application->run()
    #3 {main}

在帖子控制器中,我有这个代码:

public function actionAdd_comment()
{
  //print_r($_POST);
  $model = new \app\models\Comments;
  if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    $model->comment_date = date('Y-m-d H:i:s');
    if ($model->save()) {
      echo 'Thanks for your comment.';
    } else {
      echo 'Failed!';
    }
  }
}

错误中的哪一行 117 是:

echo 'Thanks for your comment.';

我该如何解决这个问题?


答案 1

从 Yii 2.0.14 开始,你不能在控制器中回显。必须返回响应:

public function actionAdd_comment() {
    $model = new \app\models\Comments();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $model->comment_date = date('Y-m-d H:i:s');
        if ($model->save()) {
            return 'Thanks for your comment.';
        } else {
            return 'Failed!';
        }
    }
}

如果无法避免回显,也可以在方法末尾调用以防止进一步处理,或者使用 和 包装代码。exitob_start()ob_get_clean()

public function actionAdd_comment() {
    $model = new \app\models\Comments();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $this->someMagicWithEcho();
        exit;
    }
}

public function actionAdd_comment() {
    $model = new \app\models\Comments();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        ob_start();
        $this->someMagicWithEcho();
        return ob_get_clean();
    }
}

答案 2

虽然我接受rob006的解决方案是正确的,但我遇到了控制器中没有回声的情况,但我也得到了错误。在浏览了几个网站寻找解决方案后,我发现了另一种选择。

您可以检查 php.ini 文件并确保启用了输出缓冲区。如果没有,您可以通过在php中添加此行来启用它.ini如果它不存在:

output_buffering = on

并仅对脚本将其关闭 - 脚本中的任何一个都不需要它...

  1. 呼叫 或ob_end_flush()
  2. ob_end_clean()

推荐