Ответ 1
Проблема заключалась в этой строке:
'cookie' => 'xxxx.com',
в session.php. По-видимому, он теряет cookie, если у вас есть "." в имени файла cookie. Я не могу поверить, что Ларавелу это не нравится. Или, может быть, браузер в целом.
Я использую "хранилище файлов" для своей сессии. Когда я запустил это:
Session::set('awesomekey', 'myVal123');
И обновите страницу, я вижу каждый раз новые файлы, созданные в /storage/session. Я предположил, что он будет обновлять один и тот же файл каждый раз. Это в основном означает, что сеансы вообще не работают. Другими словами, если он сохраняет воссоздание файла сеанса, это никогда не работает:
Session::get('awesomekey');
Или, по крайней мере, он возвращает пробел. Что мне не хватает, что может привести к созданию нового сеансового ключа при каждом загрузке страницы?
UPDATE
При дальнейшем расследовании кажется, что cookie регенерируется при каждой загрузке страницы. Что может быть причиной этого?
Я даже не смотрю на вход в систему, поэтому эта информация для меня бесполезна → http://willworkforbanjos.com/2014/02/laravel-sessions-not-working-in-4-1/
Моя проблема возникает, когда я просто помещаю вышеуказанный набор и получаю код в файле master.blade.php. Он должен установить его, сохранить информацию, а при следующей перезагрузке получить нужную информацию из сеанса. Но это невозможно, потому что при перезагрузке он изменил файл cookie на какой-то другой код.
Кто-нибудь знает, почему это происходит?
ОБНОВЛЕНИЕ 2
Просто чтобы понять, что я пытаюсь сделать. Я добавлю следующий код в HomeController.php:
public function index()
{
Session::put('awesomekey', 'myVal123');
return View::make('home.index');
}
Затем я помещаю это в свой master.blade.php:
print Session::get('awesomekey');
Я не включаю никаких "штампов" или случайных эхо-сигналов в моей стороне контроллера кода, за исключением этого. Когда я открываю файл в первый раз, я вижу, как myVal123 распечатывается.
Затем я вынимаю эту часть в контроллере:
Session::put('awesomekey', 'myVal123');
И перезагрузите страницу. Теперь он ничего не печатает. Я вижу в своем браузере, что cookie изменился. Создание нового файла cookie потеряет ссылку на сеанс, поэтому я застрял, пытаясь понять, почему он это делает каждый раз, даже если он сохраняет сеанс при первом загрузке.
Любые идеи?
ОБНОВЛЕНИЕ 3
Я также пробовал:
У меня действительно заканчиваются идеи...
ОБНОВЛЕНИЕ 4
Я пошел в SessionManager.php и только под этим:
$lifetime = $this- > app ['config'] ['session.lifetime'];
Я распечатал значение времени жизни:
print $lifetime; die();
И этот код никогда не попадал на перезагрузку страницы?! Однако, добавив это в мой контроллер:
$d = Config::get('session.lifetime');
print $d;
Фактически распечатывает мое значение для жизни....: (
Проблема заключалась в этой строке:
'cookie' => 'xxxx.com',
в session.php. По-видимому, он теряет cookie, если у вас есть "." в имени файла cookie. Я не могу поверить, что Ларавелу это не нравится. Или, может быть, браузер в целом.
Я считаю, что вы используете:
'lifetime' => 0 // number of minutes
в вашем файле app/config/session.php
. Сделайте это примерно так:
'lifetime' => 120 // number of minutes or whatever you want
Это сработает. Я пробовал те же настройки, которые вы описали, и просто использовал 0
, и я получаю тот же результат, каждый раз, когда создается новый файл, но как только я меняю его на 120
или так, он работает. Таким образом, имеет смысл, что если он настроен на 'lifetime' => 0
в конфигурации сеанса, то каждый раз, когда он просто создает новый файл для нового сеанса, потому что сеанс не живет. Итак, перейдите в свой app/config/session.php
файл, и вы найдете что-то вроде этого, измените значение:
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
Вы можете использовать следующий код, чтобы получить значение lifetime
, установленное в файле app/config/session.php
:
Config::get('session.lifetime');
Посмотрите время истечения срока действия файла cookie в инструментах разработчика Chrome или Firebug. Если он установлен в 0, то файл cookie истекает немедленно.
Кроме того, проверьте, правильно ли настроены часы - могут произойти странные вещи, если есть разница между вашим хостом и часами браузера. Попросите обе системы обратиться к NTP, чтобы убедиться, что это не проблема.
У меня была аналогичная проблема с сеансами, если вы используете модель. Пользователь и ваша таблица пользователей не имеют primaryKey как Id, вы должны перезаписать эту переменную в модели.
class User extends Eloquent {
protected $primaryKey = 'admin_id';
}
В/app/config/session.php проверьте настройку "Только HTTPS Cookie".
Убедитесь, что это "secure = > false", если вы не используете SSL!
У меня возникли проблемы, связанные с этим. Файл сеанса не создавался каждый раз, но иногда я просто не могу получить отображаемую переменную сеанса. После нескольких часов экспериментов я обнаружил, что проблема связана с Debugbar.
Если вы используете Debugbar и имеете проблемы с сеансом, отключите его и повторите попытку подтверждения.
Используйте Session:: put ('значение') вместо set.