В нашем приложении мы делимся данными сеанса между новым отделенным приложением, созданным с помощью symfony 4.3, и старым унаследованным кодом. Обе кодовые базы управляют данными сеанса на серверах memcached. В приложении Symfony мы используем Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler
для обработки данных, и мы переопределили два его метода для заполнения стандартного пакета сеансов Symfony, называемого _sf2_attributes
, эти два метода выглядят так:
* Symfony attributes bag key
*/
const SF_ATTRIBUTES_BAG_KEY = '_sf2_attributes';
/**
* read session from memcached
*
* @param string $sessionId Id of session
*
* @return string
*/
protected function doRead($sessionId) {
$data = parent::doRead($sessionId);
return serialize(
[
self::SF_ATTRIBUTES_BAG_KEY => empty($data) ? [] : unserialize($data)
]
);
}
/**
* Write session data into session
*
* @param string $sessionId id of session
* @param string $data data to write
*
* @return bool
*/
protected function doWrite($sessionId, $data) {
$data = unserialize($data);
$data = array_key_exists(self::SF_ATTRIBUTES_BAG_KEY, $data) ? $data[self::SF_ATTRIBUTES_BAG_KEY] : [];
return parent::doWrite($sessionId, serialize($data));
}
Однаков какой-то момент совершенно случайно данные сеанса не могли быть прочитаны. При выполнении этого и отладке с помощью запроса memcached для моего сеанса я вижу, что данные там повреждены и выглядят как
631:"O:37:"Namespace\Namespace2\Models\U %_S�<_`":17@d
16:"is_auth iicated�^8�dmi�q13�_view�+1 ~
и так далее. Сравнивая их с «обычными» данными сеанса сразу после обновления сеанса, я вижу единственное отличие: поврежденные данные содержат следующее: Symfony\Comp �nt\S�-\Guard\TD�\BSA�"``":394:{a#�!�@� t�jD�*��Of�App�bCo" .{ �!/*!j�*_ $ȤI*H b��GU@x�(@]�"@�"O r'
�O@1!ROLE_ADMIDn} R!�1 Z2 �$�@(O:4 ��.C%�\Gk`+@@�4!b� 4`�A�1�
�3 �FW# ]@�s�
*}}";}
, что, вероятно, означает, что Symfony\Component\Guard
, который мы используем, добавляет некоторые данные, вызывая наши перезаписанныеdoWrite
и повреждение данных.
Вопросы:
- Есть ли событие, когда компонент защиты добавляет данные в сеанс? Мы ничего не сохраняем в аутентификаторе сеанса, а просто читаем данные. Нам нужно получить шаги, чтобы воспроизвести это
- Есть идеи, как это исправить?