最近、ZF2 が提供する Memcached キャッシュ アダプターの使用を開始しました。Web ブラウザー (Apache HTTP サーバー) を使用すると、サーバーは完全に実行されているように見えますが、CLI からアプリケーションを実行すると、2 つの異なる例外が見られました。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 アダプターは メソッドとメソッドに基づいて例外をスローしMemcached::getResultMessage()
ます。これ以前は、単に結果コードやメッセージをチェックしていなかったため、ずっと発生していた可能性があります。
私の開発環境の仕様は次のとおりです。
- PHP 5.5 と Memcached 2.2.0 (PECL)
- Memcached 1.4.20
- libmemcached 1.0.18
- Zend フレームワーク 2
編集: 問題を単一のコントローラーの単一のアクションに絞り込みましたが、なぜこれが起こっているのかについてはまだ途方に暮れています。基本的に一連の cron ジョブをループし、独自のプロセスでフォークする ZF2 コントローラー アクションがあります。こんなふうになります...
- cron ジョブをループする
- 実行
pcntl_fork()
して新しいプロセスを作成する - 走る
exec('/usr/bin/php index.php JOB_NAME')
結局のところ、3 番目のステップは問題なく実行されます。各ジョブは期待どおりに実行されていますが、フォークによって親プロセスの Memcached に問題が発生しているようです。それが私が今いる場所です。