Как решить "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));
}    

Документы и форумы говорят о проблеме с спецификацией. Все же в моем блокноте ++ все файлы сохраняются как UTF-8 без спецификации. Должен ли я сделать специальную проверку файлов? Какие? Или может быть другая причина ошибки?

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

6 ответов

Решение

Использование

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

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

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

 /* white spaces here*/   <?php

    //YOUR CODE 

 ?> /* white spaces here 

В моем случае, также приложение 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

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

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

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

ob_start();

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

ob_start();
ob_clean();

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

Другие вопросы по тегам