2

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

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

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

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

getProductIdsByCategory一个问题是,如果管理员端的某个人添加了新产品并将其与类别相关联,那么在新会话开始之前,客户将不会在缓存中出现新的 productId 。

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

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

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

谢谢

4

7 回答 7

5

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

不过,我真的不推荐它。我建议采用一种方法来表明应该刷新此缓存数据,例如在session_start()发生时查看数据库存储的时间戳,如果缓存数据早于时间戳,则刷新缓存。

于 2009-07-19T12:50:26.207 回答
3

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

唯一能想到的另一种方法是让应用程序检查脏缓存数据的标志并自行删除,或者如果您的缓存以可解析的序列化形式位于数据库中,则编写一个昂贵的脚本来读取它们,但这会创建已经读取数据的请求严重滞后。

我会使用真正的共享状态而不是检查对象副本。

于 2009-07-19T12:47:54.973 回答
1

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

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

于 2009-07-19T12:49:38.297 回答
1

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

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

于 2009-10-12T21:46:37.537 回答
0

是的,您应该将其移至全局缓存。会话并不意味着可以在全球范围内访问,我几乎不认为这是可能的。

于 2009-07-19T12:51:04.240 回答
0
<?php session_destroy(); ?> // To delete whole session
// OR
<?php unset($_SESSION['myVar']); ?>  // To delete a session myVar
于 2020-12-08T05:07:33.503 回答
-2

清除会话值使用:

unset($_SESSION['x']); 

您可以为此循环会话

于 2009-07-19T12:49:09.950 回答