快速注意,我不是在讨论现有会话,我知道,如果内存缓存服务器脱机,它们将会丢失。
想象一下以下情况:
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。
答案 0 :(得分:0)
似乎3.0.x中的故障转移被破坏了。我一直试图解决这个问题几个小时,会话故障转移只适用于稳定分支(2.2.x)。试过3.0.5,3.0.4并且都失败了。
使用3.0.6时 - 它以静默方式失败并且不会返回任何错误。使用3.0.4或3.0.5时,会出现段错误,并且不会返回任何内容。
所以我建议使用你自己的自定义会话处理程序,它封装并使用memcache来存储会话。在那里,您可以实现自己的故障转移机制。