0

我们最近开始使用 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 作业并将它们分叉到自己的进程中。事情是这样的……

  1. 循环执行 cron 作业
  2. 运行pcntl_fork()以创建新进程
  3. exec('/usr/bin/php index.php JOB_NAME')

事实证明,第三步执行没有任何问题。每个作业都按预期运行,但似乎分叉正在父进程中创建 Memcached 问题。这就是我现在的位置。

4

0 回答 0