Несколько экземпляров случайным образом выходят из системы

Я запускаю Yii-приложение на Appfog. Всякий раз, когда я пытаюсь создать более 1 экземпляра, больше невозможно оставаться в системе.

Я знаю, что для нескольких экземпляров требуется общее хранилище для сессий, и я реализовал это с помощью EDMSHttpSession. И он работает на локальном хосте, то есть я могу войти, перезапустить Apache и остаться в системе. Кроме того, если я удаляю запись сеанса в базе данных, я вышел. Это заставляет меня заключить, что PHP использует базу данных для хранения сессий.

Я не могу понять, почему мое общее хранилище для сессий не работает в Appfog, и я хотел бы получить предложения о том, как это отладить.

Еще немного справочной информации:

  • Я использую куки для автоматического входа. Они должны быть действительны в течение 30 дней (и в соответствии с инспектором Chrome), но это никогда не срабатывает более чем на несколько часов (я полагаю, в браузере) - не на localhost, не в Appfog.
  • При включенных нескольких экземплярах и включенной автологине (то есть я нажимаю "запомнить меня"), меня все равно выгружают случайным образом, обычно после обновления на 2 или 3 страницы. Как я понимаю, файлы cookie должны входить в систему автоматически, независимо от сеансов на сервере?
  • В Appfog у меня есть SSL-оконечная точка, на localhost- нет.
  • Я проверил, что мое общее хранилище сеансов в Appfog получает новые сеансы (просматривая таблицы базы данных)

Обновить:

Я провел несколько тестов, и, возможно, мои результаты пригодятся кому-то.

Я очищаю все файлы cookie и перезапускаю приложение Appfog. Я вхожу в систему и проверяю "Запомнить меня". Теперь следующий заголовок Set-cookie ответа:

Set-Cookie:PHPSESSID=vrfoi0o15v3qps2644uqtvkfa1; path=/  
Set-Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; path=/  
Set-Cookie:73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D; expires=Sun, 09-Jun-2013 08:32:24 GMT; path=/

В последующем запросе Cookie-заголовки запроса:

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D

я использую "db38s1k1vp5ngll837ac0vh0u7" найти мою сессию в базе данных. Эта строка выглядит следующим образом (обратите внимание, что vrfoi0o15v3qps2644uqtvkfa1 не найден в базе данных):

{
  "_id" : ObjectId("518cb0981045979e06000000"),
  "data" : "73dfaf673b71b1f92d34b8ab63dab17b__id|s:24:\"5087ea0b3145a75545000000\";73dfaf673b71b1f92d34b8ab63dab17b__name|s:22:\"demo@playbackenergy.se\";73dfaf673b71b1f92d34b8ab63dab17b__states|a:0:{}73dfaf673b71b1f92d34b8ab63dab17brole|s:4:\"demo\";",
  "expire" : 1368176186,
  "id" : "db38s1k1vp5ngll837ac0vh0u7"
}

Теперь я перезапускаю свое приложение Appfog снова и пытаюсь перейти на другую страницу в моем приложении. Теперь я выхожу из системы.

Запрос Cookie-заголовков перед перенаправлением на страницу входа был (такой же, как и раньше):

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D

2 ответа

Решение

Наконец, я успешно отладил эту проблему, благодаря предложениям Михаэля Хертла.

Я должен был исправить две вещи

1) Укажите идентификатор приложения в защищенном / config / main.php

array(
    'name' => 'My App',
    'id' => 'yourdomain',
    ...,
)

Если вы этого не сделаете, несколько экземпляров будут иметь разные идентификаторы. Поскольку Yii использует хеш app-id для добавления префикса к переменным сеанса, он будет разделен между различными экземплярами - даже если у вас есть общее хранилище сеансов. Эта Yii-статья объясняет это более подробно: http://www.yiiframework.com/wiki/135/single-sign-on-across-multiple-subdomains/

2) Используйте CDN для активов вместе с разделяемой цепочкой. Очевидно, что папка ресурсов (например, 3f4ad45) может отличаться в этом экземпляре, и поэтому вы должны использовать общее хранилище. Я использовал расширение http://www.yiiframework.com/extension/s3assetmanager/ для управления активами и https://github.com/aarondfrancis/yii-CMemCacheSASL для кеша (MemCachier).

Вы только попросили предложения о том, как отлаживать, так что вы идете:

  • Добавьте различные скрытые строки в каждый из файлов макета вашего экземпляра, чтобы вы могли видеть, какой экземпляр обслуживает текущий запрос
  • Изучите файлы cookie в заголовках ваших запросов / ответов в браузере, чтобы выяснить, отправляется ли один и тот же идентификатор сеанса при каждом запросе и когда новый отправляется обратно с вашего сервера.

Это может помочь вам выяснить, при каких условиях сеанс потерян.

ОБНОВИТЬ

  • Выясните, действительно ли сеанс уничтожен или Yii просто выходит из системы. Чтобы сделать это, запишите что-нибудь в сеанс в качестве гостевого пользователя и попробуйте, если эта информация будет потеряна при некоторой перезагрузке.
  • запрещать allowAutoLogin и посмотрим, работает ли это сейчас.
Другие вопросы по тегам