【问题标题】:What exactly happens with new session creation when php + memcache PECL extension 'looses' one of its memcache session servers?当 php + memcache PECL 扩展“丢失”其 memcache 会话服务器之一时,新会话创建究竟会发生什么?
【发布时间】:2011-11-22 12:53:58
【问题描述】:

快速说明,我不是在谈论现有会话,我知道,如果 memcache 服务器脱机,它们将会丢失。


想象以下情况:

a) PHP

b) PECL 内存缓存扩展 (http://pecl.php.net/package/memcache)

c) 将 PECL 内存缓存设置为会话处理程序

d) 通过 session.save_path = "tcp:....., tcp:.....";

设置多个 memcache 服务器来执行此操作

e) 其中一个内存缓存服务器出现故障(服务器重新启动、守护进程停止等)。因此,在这一点上,我们仍然会留下至少一个有效且正常工作的 memcache 服务器。

上述情况如何影响正在创建的新会话?

我查看了http://www.php.net/manual/en/memcache.ini.php 的 memcache 手册,手册有点薄。

虽然它确实说与http://www.php.net/manual/en/memcache.addserver.php 中列出的参数相同。

我们已尝试关闭我们的一个 memcached 服务器进行测试,我们的 php 日志开始填充“无法写入会话数据,请检查您的......”。

目前我们的 session.save_path ini 设置看起来像:

session.save_path = "tcp://xxx.xxx.xxx.xxx:z?persistent=1, tcp://yyy.yyy.yyy.yyy:z?persistent=1";

所以,总结一下:

1) 当其中一个会话处理程序发生故障时会发生什么?

2) 有没有办法将此扩展配置为在尝试失败时透明地尝试列出的“其他”内存缓存服务器之一?还是自动完成?

3) 在 memcache 运行时配置手册页 @ php.net 我看到一个设置“memcache.allow_failover”,默认为 true (on),这是否也适用于会话处理?还是只在 'in php' 中调用 memcache?

谢谢。


进一步澄清,我们使用的是位于 http://pecl.php.net/package/memcache 的扩展程序的 3.0.6 版本。

【问题讨论】:

    标签: php session memcached


    【解决方案1】:

    似乎 3.0.x 中的故障转移已损坏。我一直在尝试解决这个问题几个小时,会话故障转移只在稳定的分支(2.2.x)上工作。尝试了 3.0.5、3.0.4 对我来说都失败了。

    使用 3.0.6 时 - 它会静默失败并且不返回任何错误。使用 3.0.4 或 3.0.5 时,它会出现段错误并且不返回任何内容。

    所以我建议使用您自己的自定义会话处理程序,该处理程序封装并使用 memcache 来存储会话。您可以在那里实现自己的故障转移机制。

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多