Есть ли способ очистить некоторые данные сеанса от ВСЕХ сеансов? - PullRequest
2 голосов
/ 19 июля 2009

В общем, у меня следующий сценарий:

  • Получить продукт и связанные с ним данные из базы данных
  • Преобразование выбранных данных в объект php 'product'
  • кеширование объекта продукта в сеансе

Кэш доступен только для чтения, т. Е. Клиенты просматривают товары на сайте.

Но есть такие вызовы, как getProductIdsByCategory($categoryId), и идентификаторы продуктов из этих результатов также кэшируются для каждого пользователя, не используя глобальный кеш, о котором я читал.

Проблема заключается в том, что если кто-то на стороне администратора добавляет новый продукт и связывает его с категорией, то клиенты не будут получать новый productId в своем кэшированном getProductIdsByCategory, пока не начнется новый сеанс.

Есть ли способ очистить, например, $_SESSION['x'] от ВСЕХ сеансов на сервере при добавлении нового продукта? Я не хочу уничтожать все сеансы, потому что клиенты потеряют свои логины и т. Д.

Или я должен переместить эти кэшированные поиски productId в глобальный кеш?

p.s я использую пользовательский кеш, а не memcached или подобный.

Спасибо

Ответы [ 6 ]

5 голосов
/ 19 июля 2009

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

Хотя я не очень рекомендую это. Я бы порекомендовал создать метод оповещения о необходимости обновления этих кэшированных данных, например, отметку времени, хранимую в базе данных, которая просматривается, когда происходит session_start(), и если кэшированные данные старше отметки времени, кэш очищается.

3 голосов
/ 19 июля 2009

Похоже, что вы можете сделать с реальным общим состоянием через систему кеширования, такую ​​как memcache.

Единственный другой способ, который выводит на печать - это проверить приложение на наличие флагов для грязных данных кэша и удалить их самому, или, если ваш кэш находится в базе данных в синтаксическом анализируемом виде, написать сценарий дорогой читать их все, но это создаст неприятную задержку с запросами, которые уже прочитали данные.

Я бы пошел с реальным общим состоянием, чем проверка на предметные копии.

1 голос
/ 13 октября 2009

Чтобы отключить все существующие сеансы для конкретного приложения, просто измените свое приложение, чтобы изменить имя сеанса с помощью PHP session_name('new_session_name'). Эту функцию необходимо вызывать перед каждым вызовом session_start ().

На самом деле не очищает текущие сеансы, но делает их больше не пригодными для этого приложения.

1 голос
/ 19 июля 2009

Если вы не сохраняете сеансы в базе данных, очистка любого конкретного бита данных будет сложной задачей.

Я бы предложил кэширование в файлах, а не в пользовательских сессиях. Таким образом вы получаете те же преимущества, но получаете полный контроль над тем, что кэшируется и когда оно очищается.

0 голосов
/ 19 июля 2009

Да, вы должны переместить его в глобальный кеш. Сессии не предназначены для глобального доступа, вряд ли это возможно.

0 голосов
/ 19 июля 2009

для очистки значения сеанса используйте:

unset($_SESSION['x']); 

вы можете зацикливаться на сессиях для этого

...