Symfony 1.4会话随机丢失

12

几个月前我开始尝试解决这个问题,但一直没有成功。

症状:Symfony会在随机时间间隔内丢失会话信息并注销用户。它似乎与站点的负载有关。当负载较高时,用户更容易被注销,甚至可能在30秒内发生。

环境:自从问题出现以来,我已经改变了许多设置,包括php版本、Web服务器、会话存储、Symfony版本。以下是当前的设置: Ubuntu 10.04,php 5.4.0,Symfony 1.4.17,带FPM的nginx 1.0.15。以下是在factories.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会话存储。很明显,我们开始看到失去的会话。我可以百分之百地肯定,memcached没有耗尽内存,我安装了一款管理员工具,而memcached服务器几乎没有使用其分配给它的8GB内存的2%(没有浪费,根据需要分配内存)。 然后我添加了第二个memcached服务器,并配置会话处理程序以实现冗余。这对我帮助很大,我很少丢失会话。目前来看,这是一个可以接受的妥协方案。


1
我不确定还有什么其他建议。你能在开发环境中使用 ab 复制会话丢失吗? - halfer
1
你尝试过切换到传统的会话管理方法来确定memcache是否是问题所在吗? - Jestep
检查会话可用的空间。如果更改为文件解决了问题,那么可能与memcache或redis用于存储其数据的大小有关,如果流量增加,它将开始删除最近最少使用的数据。 - Zefiryn
请提供session.gc_maxlifetime选项的配置值。 - lisachenko
@dcb:你是如何使用Redis作为会话存储的?我想看一下样例程序。 - sanjeev51
显示剩余11条评论
2个回答

1

由于某些原因,memcache 似乎偶尔会出现问题,并创建一个新的会话,导致用户被注销。

正如 Jestep 建议的那样,您应该通过将 memcache 排除在外来验证是否存在问题。

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


所以,我已经转换到文件存储了,一点问题都没有。 - dcb

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接