【问题标题】:Magento sessions disappearing with memcache turned onMagento 会话随着 memcache 的开启而消失
【发布时间】:2012-01-15 09:26:01
【问题描述】:

当我们启用 memcache(在 nginx Web 服务器上)时,我们遇到会话从 Magento 1.10 随机消失的问题。

我们在 Magento 中设置 cookie 过期时间似乎并不重要,由于某种原因,会话在一小时内的任何随机时间都会消失。

如果我们关闭 memcache,它就可以正常工作。

我们最终将需要多台服务器连接到一个基于会话的缓存解决方案,因此 memcache 似乎是唯一的选择。此外,我们现在只在 memcache 中缓存会话,当我检查 memcache 统计信息时,我们离阈值限制还很远。

这是local.xml中的memcache设置:

<cache>
    <type>memcached</type>
            <path/>
            <servers>
                <localhost>
                    <host><![CDATA[127.0.0.1]]></host>
                    <port><![CDATA[11211]]></port>
                    <persistent><![CDATA[1]]></persistent>
                </localhost>
            </servers>
</cache>
<session_save><![CDATA[memcache]]></session_save> <!-- db / memcache / empty=files -->
<session_save_path><![CDATA[tcp://localhost:11211?persistent=0&weight;=2&timeout;=10&retry;_interval=10]]></session_save_path>
<session_cache_limiter><![CDATA[private]]></session_cache_limiter>

整个事情的难点在于,由于会话在一小时内的某个时间清除,因此很难重现。有时是一分钟之内,有时是 45...

我们这里有几个人在多个虚拟服务器系统中的所有不同浏览器中尝试过它(以消除冲突),他们似乎都明白同样的时间。

现在逻辑会规定,有一个进程正在刷新内存缓存,但我不知道如何测试,如果我这样做了,如何判断是什么清除了它。我查看了 Magento 代码,但找不到任何看起来像是在清除它或从 memcache 中删除会话的东西。

但我确实发现,“前端”cookie 在会话结束后仍保留在浏览器上,当我签入内存缓存板时,cookie 消失了。

并非所有的键/值都从内存缓存中消失,在这种情况下只是其中的一些。由于某种原因,我的和其他 2 或 3 个完全失踪了。

现在,我要问的不仅是有人遇到过这种情况,而且还有人对尝试什么有任何其他想法吗?

我一直在使用(著名的)memcache.php 文件来监控服务器上的 memcache 系统。我可以尝试其他任何想法/应用程序吗?

【问题讨论】:

  • 对此的任何更新,我们在 Apache 和 Memcache 上都有同样的问题。非常感谢任何帮助,这是一个紧迫的问题

标签: session magento cookies memcached


【解决方案1】:

不确定这是否能解决您的问题:

<session_save_path>
     <![CDATA[tcp://localhost:11211?persistent=0&weight;=2&timeout;=10&retry;_interval=10]]>
</session_save_path>

您需要删除分号以确保使用指定的设置。

当 memcached 配置从 Magento 的社区论坛被剪切并粘贴时,我倾向于看到这种情况。

另一件事是你为memcached daemon分配了多少内存?

内存是否因您网站上的流量而耗尽。默认memcached 安装没有任何更改将内存大小设置为64MB。如果使用了空间,它只会覆盖内存。而且您无法控制被丢弃的会话。

【讨论】:

    【解决方案2】:

    问题是由于 SSL 密钥设置不正确

    【讨论】:

      【解决方案3】:

      这可能是您的问题,也可能不是,但这是我的问题。把它放在这里,因为其他人可能会觉得它有用。

      Memcached 的过期时间不会超过 30 天(2592000 秒)。显然,它会将大于该数字的数字解释为自纪元以来的日期,并立即使项目过期。

      Magento 的 local.xml 的 session* 元素设置 PHP 环境变量。任何未在 local.xml 中设置的相关 PHP 环境变量都从 php.ini(或其他 .ini)中设置。

      所以:

      在 php.ini 中,如果 session.gc_maxlifetime 设置在 2592000 以上,你会得到一个不工作的 memcached。

      因此,将 php.ini 中的行更改为以下内容:

      session.gc_maxlifetime = 2592000
      

      【讨论】:

        【解决方案4】:

        正如clockworkgeek 所建议的,当您刷新缓存存储时,Magento 将刷新会话。如果您使用的是独立(非集群)服务器,我建议您使用 tempfs 作为会话存储,使用 memcache 作为缓存存储。当需要添加另一台服务器时,您应该在两者上运行 memcache。那时您可以将一个用于会话存储,另一个用于缓存存储。

        【讨论】:

        • 我们尚未清除集群上的缓存,我们正在使用多台服务器(在一个集群中),并且预计此站点的流量会非常高。如果我们是否使用集群,这个问题似乎会发生。另外,就像我告诉clockworkgeek 一样,我们只将memcache 用于会话。
        【解决方案5】:

        关闭缓存并查看会话是否仍然消失。如果是这样,那么内容缓存会导致会话被刷新,请在另一个端口上使用单独的 memcache 实例。

        或者将session_save 切换到db 并一次性避免整个混乱。

        【讨论】:

        • 我们不能使用数据库进行会话保存,因为网站的流量会导致数据库崩溃。当您说关闭缓存时,您指的是仅在 Magento 管理员的缓存管理部分中管理的缓存吗?如果是这样,则此问题会在该缓存打开或关闭时发生。将 memcache 放在不同的端口上会有什么帮助?我们没有使用 memcache 存储数据,只是使用会话。
        • 我的意思是说使用一个内存缓存用于数据,另一个用于会话。由于问题似乎持续存在,因此现在没有实际意义。
        • 这是否解决了问题?如何在 memcache 中分离数据/会话?
        • @Francesco config/global/session_save_path 的值(包括端口号)不必与上述 local.xml 文件中的 config/global/cache/memcached/servers/server/port 值匹配。您可以在单独的端口号上运行两个 memcached 实例,并使用这些设置来区分它们。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-23
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        相关资源
        最近更新 更多