Когда пользовательские атрибуты Symfony записываются в сессию? - PullRequest
2 голосов
/ 16 июня 2010

У меня есть приложение Symfony, которое заполняет «виджеты» приложения портала, и я заметил кое-что (что кажется) странным.В приложении портала есть фреймы, которые делают вызовы в приложение Symfony.При каждом из этих вызовов в строку запроса передается случайный ключ пользователя.Приложение Symfony сохраняет этот ключ в своем сеансе, используя myUser->setAttribute().Если входящее значение отличается от того, которое оно имеет в сеансе, оно перезаписывает значение сеанса.

В псевдокоде (и применяет синхронный характер для ясности, даже если оно может не существовать):

# Widget request arrives with ?foo=bar
if the user attribute 'foo' does not equal 'bar'
  overwrite the user attribute 'foo' with 'bar'
end

Что я замечаю, так это то, что на странице портала с несколькими виджетами (читай: несколько запросов поступают более или менее одновременно), где значение необходимо перезаписывать, каждый запрос пытается перезаписать .Это проблема времени?Когда я смотрю на распечатки журнала, я ожидаю, что первый поступающий запрос перезапишет, а последующие запросы увидят, что полученный пользовательский атрибут соответствует тому, что было просто помещено в кеш первоначальным запросом.

В этом случае последующие запросы начинаются (и проверяются) еще до того, как первый - тот, который должен перезаписать кэшированное значение - полностью завершится.Значения сеанса в действительности недоступны для последующих запросов, пока один запрос не будет выполнен полностью или может быть что-то еще, что я пропускаю?

Спасибо.

1 Ответ

3 голосов
/ 16 июня 2010

Атрибуты пользователя не записываются в хранилище до конца запроса (в sfUser::shutdown).Атрибуты загружаются в sfUser в начале запроса.Таким образом, в этом случае второй запрос должен быть инициирован после завершения первого запроса.Возможно, вам лучше всего выбрать

  • Добавить методы hardRead и hardWrite в sfUser (посмотрите, что делают sfUser::initialize и sfUser::shutdown соответственно).
  • Используйте другой метод хранения информации, который лучше поддерживает параллелизм.База данных или потенциально используемая вами система кэширования могут работать.Например, я думаю, что это можно сделать с помощью кэша APC.

Обратите внимание: в зависимости от того, какой класс вы используете для хранения, пользовательские атрибуты могут вообще не записываться в $ _SESSION.Symfony поддерживает использование многих методов для хранения пользовательских атрибутов (например, базы данных, кэша).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...