"An error occurred while handling another error: yii\web\HeadersAlreadySentException"

"An error occurred while handling another error: yii\web\HeadersAlreadySentException"

我正在尝试对基于 Yii 2 框架的留言簿应用程序提交评论。在我的 PC 上的本地主机上一切正常,但在共享主机上,当我想在视图中提交评论时,出现此错误。

这里是错误:

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}

在 postController 中我有这段代码:

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.';

我该如何解决这个问题?

从 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!';
        }
    }
}

您也可以在您的方法末尾调用 exit 以防止进一步处理或使用 ob_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();
    }
}

虽然我接受是正确的,但是我遇到过控制器没有回显的情况,但是我也报错了。在浏览了多个站点寻找解决方案后,我发现了一个替代方案。

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

output_buffering = on

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

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