在php + memcache中创建新会话究竟会发生什么?PECL扩展“丢失”其中一个memcache会话服务器?

时间:2011-09-22 06:01:43

标签: php session memcached

快速注意,我不是在讨论现有会话,我知道,如果内存缓存服务器脱机,它们将会丢失。


想象一下以下情况:

a)PHP

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

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

d)设置多个memcache服务器,通过session.save_path =“tcp:..... tcp:.....”;

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),这是否也适用于会话处理?或者只是'在php中'调用memcache?

谢天谢地。


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

1 个答案:

答案 0 :(得分:0)

似乎3.0.x中的故障转移被破坏了。我一直试图解决这个问题几个小时,会话故障转移只适用于稳定分支(2.2.x)。试过3.0.5,3.0.4并且都失败了。

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

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