【问题标题】:Is there a way to clear some session data from ALL sessions?有没有办法从所有会话中清除一些会话数据?
【发布时间】:2020-12-08 13:07:33
【问题描述】:

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

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

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

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

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

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

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

p.s 我正在使用自定义构建的缓存,而不是 memcached 或类似的。

谢谢

【问题讨论】:

    标签: php session caching global


    【解决方案1】:

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

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

    【讨论】:

    • 这听起来是个好主意。虽然我想我必须在半小时后删除那个标志?
    • 不明白为什么。它可以继续移动到过去,最近获得缓存数据的会话不会受到它的困扰。
    【解决方案2】:

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

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

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

    【讨论】:

    • memcached 是一种很好的“现代”做事方式吗?我对此了解不多。
    • @David,是的。任何可同时访问的共享状态都将起作用。一些 ORM 系统将允许这样做。请记住,在清除任何系统时都会存在差距,因为 PHP 会将共享状态复制到应用程序中。如果缓存脏了,您需要停止它重新保存......或满足您的需求的类似限制。这是您需要限制的输入。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:
          <?php session_destroy(); ?> // To delete whole session
          // OR
          <?php unset($_SESSION['myVar']); ?>  // To delete a session myVar
          

          【讨论】:

          • 您可能需要添加说明。
          【解决方案7】:

          清除会话值使用:

          unset($_SESSION['x']); 
          

          您可以为此循环会话

          【讨论】:

          • 这只会清除当前用户的会话。如果管理员用户添加新产品,我需要清除所有用户的所有 $_SESSION['x']
          猜你喜欢
          • 1970-01-01
          • 2012-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-09
          • 1970-01-01
          相关资源
          最近更新 更多