Как решить "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 ответов
Обычно эта ошибка возникает, когда мы отправляем заголовок после отображения или печати. Если эта ошибка возникает на конкретной странице, убедитесь, что страница ничего не отображает, прежде чем вызывать 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()