Несогласованная сериализация сеансов на разных серверах

#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