【问题标题】:PHP Memcache(d) based sessions : Should garbage collection be disabled?基于 PHP Memcache(d) 的会话:是否应该禁用垃圾收集?
【发布时间】:2012-11-17 23:28:36
【问题描述】:

当使用 pecl memcached(或者我猜是 memcache..)扩展时,是否应该通过将概率设置为 0 来禁用 php 的会话垃圾收集(例如:session.gc_probability / session.gc_divisor)?

这似乎是合乎逻辑的,原因如下:

A) 会话到期时间很可能只是通过在存储的密钥上设置到期时间来存储。 EG:每个会话都有其到期 ttl,并在到期时由 memcached 简单地清除。

B) 要清除 memcached 本身未清除的现有会话,memcached 扩展必须对存储在 memcache 守护进程中的所有数据进行完全转储,检查每个键以查看键是否匹配定义的模式,然后检查何时添加密钥,最后根据需要删除。由于以下原因,这不太可能:1)据我所知,无法确定何时将密钥添加到 memcache。只有当它到期时。 2) 转储 + 解析对 memcache 实例来说会非常繁重。

再一次,memcache(d) pecl 扩展很可能只是禁用了 php 的会话垃圾收集?

谢谢。

【问题讨论】:

    标签: php session garbage-collection memcached


    【解决方案1】:

    PHP ini 设置session.gc_maxlifetime 定义会话条目的到期时间。如果您禁用此选项,您的会话将永远处于活动状态。

    如果您查看 Memcached 源代码,很容易发现其行为(即使您不懂 C):https://github.com/php-memcached-dev/php-memcached/blob/e781e169871fd4f14f844ce3e01860e84ec28831/php_memcached_session.c#L325-L327

    过期默认设置为 0,并且仅在 PHP ini 设置 session.gc_maxlifetime 设置为大于 0 的情况下设置。仅仅因为设置包含 gc 并不能说这与PHP 会话垃圾收集。 Memcached 扩展只是解释这个选项,因为它可以使用它。如果您使用 Memcached,则不需要 PHP 垃圾收集,因为它会自行清理,并且扩展本身会禁用垃圾收集。

    但您仍然需要设置设置!

    【讨论】:

    • 实际上......在谈论 memcached 会话时这是不正确的......没有办法知道 memcached 存储的元素何时到期......所以实际发生的是当会话被写入时对 memcached,它被赋予一个 ttl...每个请求都会更新这个元素(因此 ttl 被扩展)...所以不是 GC 处理会话删除,而是元素简单地过期,并被 memcached 服务器删除。跨度>
    • 我扩展了我的答案,这仍然成立。
    • 你是对的。唯一适用的设置是 session.gc_maxlifetime,因为它将确定 memcached 元素的 ttl。感谢您的澄清,不胜感激。
    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 2015-02-28
    • 2012-12-20
    • 2020-01-21
    • 2010-12-15
    • 2014-05-13
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多