CakePHP3からMemcachedを利用する

環境

  • CentOS7
  • PHP5.6
  • CakePHP3
  • Memcached

前提条件

PHP5.6の拡張モジュールを、Remiリポジトリから
yumインストールできる状態を前提としています。

PHP5.6以外のバージョンでは試していませんが、
もしかしたら、必須モジュールが変わっているかもしれません :'(

また、Memcachedがインストールされていて、
利用できる状態である必要があります。

PHP拡張モジュールのインストール

MemcachedをPHPから利用するために必要な、
下記の拡張モジュールをインストールしていきます。

  • msgpack
  • igbinary
  • memcached

下記コマンドで簡単にインストール可能です 🙂

$sudo yum --enablerepo=remi install php56-php-pecl-msgpack
$sudo yum --enablerepo=remi install php56-php-pecl-igbinary
$sudo yum --enablerepo=remi install php56-php-pecl-memcached

拡張モジュールのシンボリックリンク作成

yumインストールしたら、
拡張モジュールのシンボリックリンクを作成しましょう。

$sudo ln -s /opt/remi/php56/root/usr/lib64/php/modules/msgpack.so /usr/lib64/php/modules/
$sudo ln -s /opt/remi/php56/root/usr/lib64/php/modules/igbinary.so /usr/lib64/php/modules/
$sudo ln -s /opt/remi/php56/root/usr/lib64/php/modules/memcached.so /usr/lib64/php/modules/

拡張モジュールの読み込み設定

必要な拡張モジュールをインストールしたら、
モジュールを読み込むように設定します。

php.iniに直接書いてしまってもいいですし、
拡張モジュールを格納するディレクトリにiniファイルを
入れてしまっても良いでしょう。

$sudo echo 'extension=msgpack.so'   > /etc/php.d/40-msgpack.ini
$sudo echo 'extension=igbinary.so'  > /etc/php.d/40-igbinary.ini
$sudo echo 'extension=memcached.so' > /etc/php.d/50-memcached.ini

僕の環境では、拡張モジュールは/etc/php.d/で読み込み設定を
行っているようでしたので、その方法に従いました。

CakePHPの設定

CakePHP3からMemcachedを使うためには、
config/app.phpに設定を記述する必要があります。

<?php
// ...
    'Cache' => [
        'default' => [
            'className' => 'Cake\Cache\Engine\MemcachedEngine',
            'path' => CACHE,
            'servers' => [env('127.0.0.1:11211')],
            'prefix' => 'myapp_cake_core_',
            'username' => env('memcahed'),
            'duration' => '+1440 minutes',
        ],

        /**
         * Configure the cache used for general framework caching.
         * Translation cache files are stored with this configuration.
         */
        '_cake_core_' => [
            'className' => 'Cake\Cache\Engine\MemcachedEngine',
            'prefix' => 'myapp_cake_core_',
            'path' => CACHE . 'persistent/',
            'duration' => '+2 minutes',
        ],

        /**
         * Configure the cache for model and datasource caches. This cache
         * configuration is used to store schema descriptions, and table listings
         * in connections.
         */
        '_cake_model_' => [
            'className' => 'Cake\Cache\Engine\MemcachedEngine',
            'prefix' => 'myapp_cake_model_',
            'path' => CACHE . 'models/',
            'duration' => '+2 minutes',
        ],
    ],

// ...
?>

prefixはおそらく自由に設定して大丈夫でしょう。
キャッシュの保存期間は2分程度に設定してあります。

Webサーバの再起動

apacheやNginxなど、インストールされている
Webサーバを再起動してください。
PHPからMemcachedを利用できるようになっているはずです。

Memcachedを有効化するまでのエラー

undefined symbol:php_json_decode_ex

memcachedのみをインストールした際に発生しました。
拡張モジュール(extension)のロード順を、
memcachedがigbinaryとmsgpackより後に読み込まれるよう変更して解決しました。

undefined symbol: igbinary_serialize

拡張モジュールigbinaryをインストール・ロードすることで解決しました。

undefined symbol: php_msgpack_serializ

拡張モジュールmsgpackをインストール・ロードすることで解決しました。

1 is not a valid serializer engine for Memcached

CakePHPの初期化処理(_setOptions)でエラーが発生している状態です。
config/app.phpのCache設定を修正したところ解決しました。

_cake_core_にserializerという余計なプロパティが設定されていたので、
削除したところ無事動きました。