環境
- 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という余計なプロパティが設定されていたので、
削除したところ無事動きました。