如何解决“session_regenerate_id():无法重新生成会话ID - 已发送的标头”

时间:2013-10-07 15:45:33

标签: php yii sessionid byte-order-mark

因为我已将yii应用程序移动到其他共享主机并且应用程序已运行... index.php?r =使用登录凭据进行站点/登录我得到了警告:

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的问题。然而在我的记事本++中,所有文件都保存为 UTF-8而没有BOM。 我应该对文件进行特殊检查吗?哪个? 或者可能有其他原因导致错误?

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

7 个答案:

答案 0 :(得分:10)

使用

ob_start()

在文件的开头。

答案 1 :(得分:3)

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

不可预测的错误示例:

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

//your page content

有时它在本地计算机中无关紧要,但在远程服务器中则很重要。

答案 2 :(得分:0)

让用户在使用$ model-&gt; login()

的函数中回显任何内容

答案 3 :(得分:0)

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

答案 4 :(得分:0)

根据我的经验,它主要是白色空间的错误。有时候是一个空间    打开php标签或某些时候文件末尾的空格 结束后?&gt;

 /* white spaces here*/   <?php

    //YOUR CODE 

 ?> /* white spaces here 

答案 5 :(得分:0)

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

This old discussion关于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

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

答案 6 :(得分:0)

尝试使用

ob_start();

如果这不起作用,请尝试关注

ob_start();
ob_clean();