5

我已经将一个 Yii 应用程序移动到另一个共享主机。当应用程序使用登录凭据运行 ...index.php?r=site/login 时,我收到了警告:

session_regenerate_id(): Cannot regenerate session id - headers already sent

actionLogin代码:

public function actionLogin($name = null )
{
    $model=new LoginForm;
    if ($name) $model->username = $name;
    if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
    {
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }
    if(isset($_POST['LoginForm']))
    {
        $model->attributes=$_POST['LoginForm'];
        // validate user input and redirect to the previous page if valid
        if (headers_sent($filename, $linenum))
               {
            echo "Headers have been sent in {$filename} line number is {$linenum}\n"
            exit;
        }

        if($model->validate() && $model->login())
            $this->redirect(Yii::app()->user->returnUrl);
    }
    // display the login form
    $this->render('login',array('model'=>$model));
}    

文档和论坛都说 BOM 可能有问题。然而,在我的 Notepad++ 中,所有文件都保存为没有 BOM 的 UTF-8

我应该对文件进行特殊检查吗?哪个?还是可能有其他错误原因?

我添加了headers_sent($filename, $linenum)函数(参见上面的代码)来跟踪发送的标头,但没有结果。

4

7 回答 7

13

利用

ob_start()

在文件的开头。

于 2013-10-07T15:47:29.713 回答
6

通常,当我们在回显或打印后发送标头时会出现此错误。如果此错误出现在特定页面上,请确保该页面在调用 start_session() 之前没有回显任何内容。

不可预测的错误示例:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

有时它在您的本地计算机中并不重要,但在您的远程服务器中很重要。

于 2015-02-03T04:30:03.277 回答
1

我在 Yii 项目的 main.php 开头有一个空行,删除它为我解决了这个问题。

于 2015-02-18T07:22:57.173 回答
1

在我的情况下,也是一个 Yii 应用程序,在部署到新的基础架构后登录到 Web 应用程序时会引发相同的错误。我能够比较以前和新基础设施之间的配置文件,结果发现我忘记在 php-fpm 容器上的php.ini中启用输出缓冲。

这个关于 GitHub 上 Yii 问题板上的错误消息的旧讨论给了我在配置文件中寻找什么的提示。

现在在我的php.ini中我有这个设置:

; Note: Output buffering can also be controlled via Output Buffering Control
;   functions.
; Possible Values:
;   On = Enabled and buffer is unlimited. (Use with caution)
;   Off = Disabled
;   Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096

希望它也对其他人有所帮助。

于 2018-08-12T06:09:00.077 回答
1

根据我的经验,它主要是空白的错误。有时在开始的 php 标记之前有一个空格,或者有时在关闭之后的文件末尾有一个空格 ?>

 /* white spaces here*/   <?php

    //YOUR CODE 

 ?> /* white spaces here 
于 2016-01-01T05:16:28.373 回答
0

让用户在使用 $model->login() 的功能中不回显任何内容

于 2014-06-09T11:50:48.603 回答
0

尝试使用

ob_start();

如果那不起作用,请尝试以下

ob_start();
ob_clean();
于 2020-06-26T13:21:29.420 回答