有没有办法从所有会话中清除一些会话数据?

时间:2009-07-19 12:43:15

标签: php session caching global

一般来说,我有以下情况:

  • 从数据库中获取产品及其相关数据
  • 将提取的数据转换为php'product'object
  • 在会话中缓存产品对象

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

但是有一些调用,例如getProductIdsByCategory($categoryId),这些结果中的productId也被缓存,每个用户,而不是使用我读过的全局缓存。

问题在于,如果管理员方面的某个人添加了新产品并将其与某个类别相关联,那么在新会话启动之前,客户将不会在缓存的getProductIdsByCategory中出现新的productId。 / p>

有没有办法在添加新产品时从服务器上的所有会话中清除$_SESSION['x']?我不想破坏所有会话,因为客户将丢失他们的登录等。

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

使用自定义构建的缓存,而不是memcached或类似的。

由于

7 个答案:

答案 0 :(得分:5)

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

但是,我并不是真的推荐它。我建议使用一种方法来表示应该刷新这个缓存的数据,就像在session_start()发生时查看的数据库存储的时间戳,如果缓存的数据早于时间戳,则缓存是冲洗。

答案 1 :(得分:3)

听起来像是通过像memcache这样的缓存系统来处理真正的共享状态

打印出来的唯一另一种方法是让应用程序检查脏缓存数据的标志并自行删除它,或者如果缓存在可解析的序列化表单中的数据库中写入昂贵的脚本可以全部读取它们,但这会对已经读取数据的请求产生令人讨厌的延迟。

我会选择真正的共享状态,而不是检查对象副本。

答案 2 :(得分:1)

除非您将会话存储在数据库中,否则清除任何特定数据位将非常棘手。

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

答案 3 :(得分:1)

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

这实际上不会清除当前会话,但它会使它们对此应用程序不再有用。

答案 4 :(得分:0)

是的,您应该将其移至全局缓存。会议无意在全球范围内访问,我认为这是不可能的。

答案 5 :(得分:0)

<?php session_destroy(); ?> // To delete whole session
// OR
<?php unset($_SESSION['myVar']); ?>  // To delete a session myVar

答案 6 :(得分:-2)

清除会话值使用:

unset($_SESSION['x']); 

您可以循环播放

的会话