Как решить session_regenerate_id(): невозможно восстановить идентификатор сеанса - заголовки уже отправлены

Я переместил приложение 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));
}    

Документы и форумы говорят, что может быть проблема со спецификацией. Тем не менее, в моем Notepad++ все файлы сохраняются как UTF-8 без BOM.

Должен ли я сделать специальную проверку файлов? Какие? Или может быть другая причина ошибки?

Я добавил функцию headers_sent($filename, $linenum) (см. код выше) для отслеживания отправленных заголовков, но безрезультатно.


person Igor Savinkin    schedule 07.10.2013    source источник
comment
вам нужно дополнительно изучить, есть ли у вас доступ для чтения / записи к среде выполнения и любой проблеме с файлом кеша.   -  person sakhunzai    schedule 07.10.2013


Ответы (7)


использовать

ob_start()

в начале файла.

person chandresh_cool    schedule 07.10.2013
comment
Спасибо, chandresh_cool. Я сделал это, и это помогло, но! Будет ли вывод, предотвращающий безопасное влияние на остальную часть кода? Я не включаю ob_end().? - person Igor Savinkin; 07.10.2013
comment
Привет, Чандреш, спасибо за ответ. Я нахожу это незавершенной мыслью. Не могли бы вы объяснить, почему использование ob_start() решает проблему? - person Jonathan Morales Vélez; 20.12.2019

Обычно эта ошибка возникает, когда мы отправляем заголовок после эха или печати. Если эта ошибка возникает на определенной странице, убедитесь, что эта страница ничего не повторяет, прежде чем вызывать start_session().

Пример непредсказуемой ошибки:

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

//your page content

Иногда это не имеет значения на вашем локальном компьютере, но имеет значение на вашем удаленном сервере.

person Biswadeep Sarkar    schedule 03.02.2015

У меня была пустая строка в начале main.php в Yii Project, удаление которой решило проблему для меня.

person Community    schedule 18.02.2015

Из моего опыта это в основном ошибка пробелов. Иногда пробел перед открывающим тегом php или иногда пробел в конце вашего файла после закрытия ?>

 /* white spaces here*/   <?php

    //YOUR CODE 

 ?> /* white spaces here 
person TheVigilant    schedule 01.01.2016

Заставьте пользователя ничего не повторять в функции, где вы используете $model->login()

person Tarun Gupta    schedule 09.06.2014

В моем случае, также с приложением Yii, та же ошибка возникала при входе в веб-приложение после развертывания в новой инфраструктуре. Мне удалось сравнить файлы конфигурации между предыдущей и новой инфраструктурой, и оказалось, что я забыл включить буферизацию вывода в php.ini в контейнере php-fpm.

Это старое обсуждение сообщения об ошибке на доске вопросов Yii на GitHub дало мне подсказку о что искать в конфигурационных файлах.

Теперь в моем 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

Надеюсь, это поможет и другим.

person rijam    schedule 12.08.2018

попробуй использовать

ob_start();

если это не сработает, попробуйте выполнить

ob_start();
ob_clean();
person Mac Rathod    schedule 26.06.2020