12

这是我几个月前开始尝试的一个问题,从那以后我一直在尝试解决,但没有成功。

症状:symfony 在随机的时间间隔丢失会话信息并注销用户。它似乎以某种方式与网站的负载有关。当负载较高时,用户退出的频率似乎更高,甚至可能发生在 30 秒之内。

环境:从这开始我改变了很多设置,包括 php 版本、Web 服务器、会话存储、symfony 版本。这是当前设置:Ubuntu 10.04、php 5.4.0、symfony 1.4.17、带有 FPM 的 nginx 1.0.15。以下是在 factory.yml 中配置会话存储的方式:

  user:
    class: myUser
    param:
      timeout:         86400
      use_flash:       true
  storage:
    class: sfCacheSessionStorage
    param:
      cache:
        class: sfMemcacheCache
        param:
          lifetime:  86400
          host:      192.168.1.3
          serializer:  IGBINARY
          mode:        compiled
          port:        11211

我不得不提一下,我也使用 redis 进行会话存储,但仍然存在问题。我真的不知道下一步该尝试什么。还有其他人经历过类似的事情吗?在这个阶段,任何提示将不胜感激。

更新: 经过数月的搜索和无数次试验和错误,我认为这可能是一个并发问题。我们的站点在 AJAX 请求上非常繁重,我了解到它可能会导致会话出现问题,除非在会话处理程序中实现了适当的锁定机制。首先,我从等式中消除了 symfony,我将其设置为使用 php 会话。使用默认文件会话存储,我永远不会丢失任何会话。然后我将 php 配置为使用 memcache 会话存储。毫无疑问,我们已经开始看到丢失的会话。我 100% 肯定 memcached 没有内存不足,我已经安装了一个管理工具,而 memcached 服务器几乎没有使用分配给它的 8GB 的​​ 2%(没有浪费,内存是根据需要分配的)。然后我添加了第二个 memcached 服务器并将会话处理程序配置为使用冗余。这很有帮助,我很少丢失任何会话。目前,这是一个可以接受的折衷方案。

4

2 回答 2

1

出于某种原因,memcache 似乎时不时地错过并创建一个导致用户注销的新会话。

正如 Jestep 所建议的,您应该通过将 memcache 排除在等式之外来证明这一点,以查看问题是否消失。

如果是这样,那么问题要么是您与 memcache 交谈的方式,要么是 memcache 本身。

于 2012-06-15T05:46:02.537 回答
0

实际上,我们过去几个月一直在使用的设置是 symfony 配置为使用普通的 php 会话(不是任何缓存类),然后 php 被设置为使用 memcache 扩展(还有一个叫做 memcached)来存储2 个冗余内存缓存服务器上的会话。如果我取出其中一台 memcache 服务器,我们会立即开始看到丢失的会话。

这是唯一真正完成这项工作的设置。

于 2012-12-30T00:30:59.990 回答