繁体   English   中英

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

[英]How to solve “session_regenerate_id(): Cannot regenerate session id - headers already sent”

我已将 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++ 中,所有文件都保存为UTF-8 而没有 BOM

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

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

使用

ob_start()

在文件的开头。

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

不可预知的错误示例:

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

//your page content

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

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

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

 /* white spaces here*/   <?php

    //YOUR CODE 

 ?> /* white spaces here 

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

在我的例子中,也是一个 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

希望它也能帮助其他人。

尝试使用

ob_start();

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

ob_start();
ob_clean();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM