Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用memcache会话保存处理程序时可能出现的问题_Php_Memcached - Fatal编程技术网

在PHP中使用memcache会话保存处理程序时可能出现的问题

在PHP中使用memcache会话保存处理程序时可能出现的问题,php,memcached,Php,Memcached,我有两个负载平衡的web服务器,我使用memcache会话保存处理程序,保存路径指向两个memcache服务器。它将会话冗余设置为两个(memcache服务器的数量)。因此PHP正在向两台memcache服务器写入会话数据,当我关闭其中一台服务器时,由于会话数据已写入两台memcache服务器,所以一切似乎都正常工作 当我只启动一台memcache服务器使用应用程序一段时间,然后又启动另一台memcache服务器时,问题似乎就发生了。我的理论是memcache服务器重新启动,然后PHP开始向它请

我有两个负载平衡的web服务器,我使用memcache会话保存处理程序,保存路径指向两个memcache服务器。它将会话冗余设置为两个(memcache服务器的数量)。因此PHP正在向两台memcache服务器写入会话数据,当我关闭其中一台服务器时,由于会话数据已写入两台memcache服务器,所以一切似乎都正常工作

当我只启动一台memcache服务器使用应用程序一段时间,然后又启动另一台memcache服务器时,问题似乎就发生了。我的理论是memcache服务器重新启动,然后PHP开始向它请求会话数据,而会话数据不在那里,因为它是在另一台服务器关闭时写入另一台服务器的。这个理论有什么优点吗?PHP是否应该向两台服务器请求会话数据,也许还有其他问题

编辑:
我使用的是PECL memcache包的2.2.6版。

这与memcache的实际分布方式有很大关系。基本上,您可以使用一个或多个服务器的列表初始化客户机。执行写入操作时,数据只发送到一台服务器,而不是全部服务器

客户机负责对缓存密钥进行散列,以确定它应该连接到哪个服务器进行读写操作——这与散列表确定给定密钥可能驻留在哪个存储桶中的原理相同。一些memcache客户端可以获得权重信息等,以便更好地进行决策

在您的情况下,您似乎正在使用两台服务器初始化客户端,然后将其中一台服务器退出服务。如果您正在重新配置(例如,通过注释掉)服务器列表,那么您实际上是在动态地更改哈希策略,它与用于确定数据存储位置的策略不一致。当您将另一台服务器备份时,客户端会将其重新合并到哈希计算中,然后这与数据的存储方式不一致

我所看到的典型解决方法是尝试并避免更改实际运行的memcached实例的数量(或顺序),通常是通过准备大量备件。如果您愿意,这些节点可以是资源较低的节点,与其他实例在同一个机箱上运行,而且它们甚至不需要是热备盘,只要您在更改memcache配置时将其打开即可

显然,如果您使用memcache来存储“重要”数据,如会话信息,而这些数据不会在其他地方持久化,那么您更关心的是保持这种完整性,而不是将其作为一次性缓存使用,最坏的情况是,这会影响您的性能一段时间。这是一种妥协,真的

值得一读:

  • ?

根据Memcache PECL页面,会话冗余ini选项仅在3.0.0版之后才可用


尝试下载最新版本并安装(pecl install/path/to/tgz),然后查看是否仍然出现错误。

通过使用以下php.ini设置尝试使用一致的哈希策略:

memcache.hash_策略=一致

这允许从池中添加或删除服务器,而不会导致密钥重新映射到其他服务器


可以通过会话冗余设置将PHP memcache会话处理程序配置为写入多个memcache节点。另外,我没有从配置中删除memcached服务器。我只是关闭了守护进程。PHP memcache会话处理程序可能无法如此优雅地处理这种情况。