我们最近开始使用 ZF2 提供的 Memcached 缓存适配器。虽然在使用 Web 浏览器 (Apache HTTP Server) 时服务器似乎运行良好,但从 CLI 运行应用程序时我发现了两个不同的异常。Zend\Session\SaveHandler\Cache
将会话写入内存时似乎会发生异常。
第一个异常返回错误代码 47 ( MEMCACHED_SERVER_TEMPORARILY_DISABLED
)。在用尽了许多选项之后,我决定尝试重新编译 Memcached、libmemcached 和 PECL 扩展。这样做之后,我开始得到一个不同的结果代码——26 ( MEMCACHED_ERRNO
)。此代码的结果消息为“SYSTEM ERROR: Broken pipe”。
在缓存适配器中,该internalSetItem($normalizedKey, $value)
方法检查返回的布尔值Memcached::set($key, $value, $expiration)
。Memcached::getResultCode()
如果为false,则发生了故障,ZF2适配器会根据andMemcached::getResultMessage()
方法抛出异常。在此之前,我们根本没有检查结果代码或消息,因此它可能一直都在发生。
我的开发环境规范如下:
- PHP 5.5 和 Memcached 2.2.0 (PECL)
- 内存缓存 1.4.20
- Libmemcached 1.0.18
- Zend 框架 2
编辑: 我已将问题缩小到单个控制器中的单个操作,但我仍然不知道为什么会发生这种情况。我们有一个 ZF2 控制器操作,它基本上循环通过一堆 cron 作业并将它们分叉到自己的进程中。事情是这样的……
- 循环执行 cron 作业
- 运行
pcntl_fork()
以创建新进程 - 跑
exec('/usr/bin/php index.php JOB_NAME')
事实证明,第三步执行没有任何问题。每个作业都按预期运行,但似乎分叉正在父进程中创建 Memcached 问题。这就是我现在的位置。