2009-07-19 93 views
2

在一般情况下,我有以下情形:有没有办法清除所有会话中的一些会话数据?

  • 获取产品,并从数据库及其相关数据
  • 转换获取的数据到PHP的“产品”对象的会话
  • 缓存的产品对象

缓存是只读的,即客户在网站上查看产品。

但有类似getProductIdsByCategory($categoryId)的调用,并且来自这些结果的productId也被缓存,每个用户不使用我已阅读过的全局缓存。

问题是,如果管理员端的某人添加了新产品并将其与某个类别关联,则客户将不会让新产品出现在其缓存的getProductIdsByCategory中,直到启动新的会话。

添加新产品时,是否有办法从服务器上的所有会话中清除例如$_SESSION['x']?我不想销毁所有会话,因为客户将失去登录等。

或者我应该将这些缓存的productId搜索移至全局缓存吗?

使用定制的缓存,而不是memcached或类似的。

感谢

回答

5

默认情况下,会话数据只是文件系统某处的序列化文件,并且可以修改所有这些文件以删除有问题的信息(尊重锁定,以便您不会踩到任何当前打开的会话)。

虽然我并不真的推荐它。我建议做一个信号发送方法,告诉这个缓存的数据应该刷新,就像数据库存储的时间戳一样,当发生数据库存储的时间戳时,如果缓存的数据比时间戳早,缓存就被刷新。

3

听起来像你可以用真正共享状态通过缓存系统内存缓存一样做。

打印到心中唯一的另一种方式是有标志的应用程序检查脏缓存数据并删除它本身,或者如果你的缓存是在一个可分析的序列化形式的数据库写昂贵脚本读取它们所有这些,但是这会在已经读取数据的请求中产生令人讨厌的滞后。

我会用真实的共享状态去检查对象副本。

+0

memcached是一种很好的“现代”做事方式吗?我对此不甚了解。 – 2009-07-19 12:52:41

+1

@大卫,是的。任何可同时访问的共享状态都可以使用。一些ORM系统将允许这样做。请记住,在任何系统中清除都会有差距,因为PHP会将共享状态复制到应用程序中。如果缓存很脏,或者需要类似的约束条件,则需要停止重新保存。这是你需要限制的输入。 – 2009-07-19 12:55:17

-2

清除会话值使用:

unset($_SESSION['x']); 

您可以在该

+0

这将只清除当前用户的会话。如果管理员用户添加新产品,我需要清除所有用户的所有$ _SESSION ['x'] – 2009-07-19 12:51:14

1

会议环路除非你存储会话在数据库中,清除数据的任何特定位将是棘手的。

我建议缓存在文件而不是用户会话。通过这种方式,您可以获得相同的好处,但您可以完全控制缓存内容以及清除时间。

0

是的,你应该把它移到全局缓存。会议并不是要全球访问,我几乎认为这是不可能的。

1

要禁用特定应用程序的所有现有会话,只需修改您的应用程序以使用PHP的session_name('new_session_name')更改会话的名称即可。这个函数需要在每次调用session_start()之前调用。

这实际上不会明确当前会话,但它使它们不再有用于此应用程序。

相关问题