簡體   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