AppFog: все пользователи автоматически выходили из системы при каждом обновлении приложения
Каждый раз, когда я обновляю свое приложение в AppFog, все зарегистрированные пользователи автоматически выходят из системы.
Из-за сеанса проиграл!
Как я могу решить эту проблему?
Приложение имеет встроенный PHP поверх Yii Framework 1.1.14.
3 ответа
Проблема в том, что Yii использует CApplication::getId() для генерации идентификатора cookie. Этот метод использует basePath для генерации этого идентификатора.
return $this->_id=sprintf('%x',crc32($this->getBasePath().$this->name));
При развертывании новой версии базовый путь вашего приложения изменяется, поэтому идентификатор cookie восстанавливается и сеансы теряются.
Решением будет указать ваш собственный идентификатор приложения в protected/config/main.php
"id" => md5(php_uname().'somHardGuessableRandomString'),
Часть somHardGuessableRandomString должна генерироваться случайным образом.
Это может произойти либо из-за сеанса, либо из-за того, что файл авторизации был перезаписан во время обновления.
см. http://www.yiiframework.com/doc/api/1.1/CHttpSession и http://in2.php.net/manual/en/session.configuration.php
Временный файл авторизации хранится в /protected/data/auth.php
по умолчанию.
Этого можно избежать, указав другой путь к этим файлам, файл сеанса по умолчанию - путь сохранения сеанса php, или перенеся управление сеансом в БД. С помощью CDbHttpSession
вместо CHttpSession
а также CDbAuthManager
вместо CPhpAuthManager
соответственно, эта статья объясняет управление сессиями в yii более подробно.
Скорее всего, это проблема авторизации, поскольку каталог приложения перезаписывается во время обновления, а не системный каталог tmp. Если вы используете контроль версий для обновления своего приложения, вы можете настроить его на игнорирование этого файла (.gitignore
или эквивалент).
Файловая система AppFof не является постоянной. При обновлении вы перестраиваете приложение на принципиально новый сервер, поэтому все, что хранится в файловой системе, теряется, включая файлы сеанса.
Вероятно, единственное решение - сохранить детали сеанса в базе данных.