![](/img/trans.png)
[英]session_regenerate_id(): Cannot regenerate session id - headers already sent in
[英]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.