警告:Memcached::getMulti():无法反序列化值,不支持 igbinary

Warning: Memcached::getMulti(): could not unserialize value, no igbinary support

我已经在我的 Drupal 站点上成功使用 memcached(通过 brew 在 OS X 上安装)几个月了。

然而,这个错误在页面加载很长时间后突然出现:

( ! ) Warning: Memcached::getMulti(): could not unserialize value, no igbinary support in sites/all/modules/contrib/memcache/dmemcache.inc on line 375

为什么会这样,为什么我需要 igbinary(我想我有)以及如何解决它?


我好像已经php56-igbinary安装好了。

$ php -i | grep igbinary
Additional .ini files parsed => /usr/local/etc/php/5.6/conf.d/ext-igbinary.ini,
igbinary
igbinary support => enabled
igbinary version => 1.2.1
igbinary APC serializer ABI => no
igbinary session support => yes
igbinary.compact_strings => On => On
igbinary support => yes
memcached.serializer => igbinary => igbinary
Registered serializer handlers => php_serialize php php_binary wddx igbinary 

Igbinary 是标准 PHP serializer 的替代品,标准 PHP serializer 通常会消耗大量时间并且 space 以文本表示形式存储数据。有了对该扩展的支持,在使用 memcached 或类似的基于内存的存储(例如 Redis)时,节省是显着的,因为所有 PHP 数据结构都以紧凑的二进制形式存储。

我处理的问题发生了,因为有两个 PHP 版本,一个来自 CLI,它具有 igbinary 支持(例如 drush 使用),另一个 [=38 使用=] 没有 igbinary:

$ /Applications/MAMP/bin/php/php5.6.10/bin/php -i | grep igbinary
igbinary support => no

所以出于某种原因,一些对象使用 PHP 和 igbinary 进行缓存,然后在没有该支持的情况下无法被 PHP 反序列化。

MAMP 似乎不为其 PHP 包提供 igbinary 支持,因此解决方案包括:

  • 扩展需要手动编译并加载到 MAMP (--enable-memcached-igbinary),
  • 在PHP CLI 中禁用igbinary(不推荐),这样它就不会与Apache 冲突,
  • 继续重启memcached,例如brew services restart memcached (OS X)
  • 使用支持 igbinary 的 PHP 内置服务器,例如:php -S localhost:8888