#php #session
#php #сеанс
Вопрос:
Я получаю непоследовательную сериализацию сеансов в своих средах разработки и производства.
Код идентичен, синхронизирован с SVN. Конфигурация Apache и PHP в основном идентична, отличается только доменное имя. Оба работают под управлением Debian Squeeze, сервер 64-разрядный, а разработка 32-разрядная.
На сервере сохраняемые данные выглядят как закодированные в base64, хотя я не уверен, что это так :
vvZKW5WEbvvRCs0-M0R8zTDAuTsKZSADKORDemOWOXqPJs0J42l7nZIewsHp8JjGFQw64Xq2x5dB_7187W4HPdJ1Yo5yK6oHvB8ofx7GL82WJCaPrzP8pR1xm02f9HenDaShvy1WTHuMuCSJ3zWGUnjRpOuJtZ49v4Dh2L5U0M4.
Данные сеанса разработки соответствуют обычному стилю PHP :
foo|s:3:"bar";baz|s:6:"wombat";promoter|O:8:"stdClass":0:{}475b17e28b25580bb92430bb286637ddlanguage|s:5:"en_us";
На сервере управление сеансами не работает должным образом, например, переход к поддомену на сайте приводит к повторной инициализации сеанса для всех поддоменов.
Я использую фреймворк Yii, хотя я устранил это как источник проблемы, скопировав вставив код, найденный здесь в моем index.php файл до того, как фреймворк выполнит какую-либо обработку.
Итак, мои вопросы: почему это происходит, и как я могу заставить сервер сохранять данные сеанса, как в среде разработки?
Кстати, я бы предпочел не прибегать к какому-нибудь неприятному взлому, например :
function writeSession($id,$data)
{
$data = serialize($_SESSION);
....
}
TIA.
Комментарии:
1. Почему бы не использовать пользовательский обработчик сеанса? Есть много хорошо написанных, доступных с полки. Действительно, поскольку я не знаю о каких-либо изменениях в формате сериализации, похоже, что ваш сервер уже использует обработчик клиента — так что переопределите его или удалите.
2. Я использую пользовательскую обработку сеансов Yii, код, на который я ссылался, должен был протестировать сериализацию без вмешательства фреймворка.
Ответ №1:
Получил некоторую помощь по этому вопросу, разница между двумя серверами заключалась в том, что на одном был установлен патч suhosin и настроен на шифрование данных сеанса, а на другом — нет.
Я установил исправление suhosin на сервере, на котором его не было, но это создавало для меня некоторые проблемы, поэтому я отключил функцию шифрования сеанса на обоих серверах. Теперь все работает так, как ожидалось.
В файле настроек, в моем случае /etc/php5/conf.d/suhosin.ini
suhosin.session.encrypt = Off