2011年2月24日木曜日

PHP ZendでMemcached使ってみる

重い処理にはキャッシュ。ということで、MemcachedをZend framworkで使用してみた。まずは、Zend frameworkのパッケージphp-ZendFrameworkでは、入らなかったのでインストールから。
# yum install --enablerepo=remi php-ZendFramework-Cache-Backend-Memcached
# /etc/init.d/httpd restart
apacheのリスタートをしないと、下記のようなエラーが出てハマる。

 PHP Fatal error:  Uncaught exception 'Zend_Cache_Exception' with message 'The memcache extension must be loaded for using this backend !'

PHPでのキャッシュはフロントエンドとバックエンドとそれぞれのオプションを指定してZend_Cacheで使う。

require_once 'Zend/Cache.php';
$frontend = array('lifetime' => 30, 'automatic_serialization' => true);
$backend  = array(compression' => true);
$cache = Zend_Cache::factory('Core',     # フロントエンド
                             'Memcached',# バックエンド
                             $frontend,  # フロントエンドオプション
                             $backend);  # バックエンドオプション
キャッシュ処理はフロントエンドで行い、キャッシュレコードの保存にバックエンドのアダプタを使う。フロントエンドについては、Zend_Cache のフロントエンドを、バックエンドはZend_Cache のバックエンドを見れば何が指定できて、どんなオプションがあるかはわかるので、ここでは書かない。

基本機能しか使わないので、フロントエンドは「Core」、Memcachedを使いたかったので、バックエンドは「Memcached」とする。
リファレンスガイドによると、Memcachedのオプションのtimeoutがデフォルトは5となっている。そんなに待つのかと怪しく思いソースを見てみる。
 43     /**
 44      * Default Values
 45      */
 46     const DEFAULT_HOST = '127.0.0.1';
 47     const DEFAULT_PORT =  11211;
 48     const DEFAULT_PERSISTENT = true;
 49     const DEFAULT_WEIGHT  = 1;
 50     const DEFAULT_TIMEOUT = 1;
 51     const DEFAULT_RETRY_INTERVAL = 15;
 52     const DEFAULT_STATUS = true;
 53     const DEFAULT_FAILURE_CALLBACK = null;
ソースを見るとデフォルトは1だった。内部的にはMemcacheクラスのaddServerに渡してるので、単位は秒。

他には特に難しいこともなくよくある使い方。キャッシュがあればキャッシュを、なければ重い処理をする。
$key = "hoge";
if(!$result = $cache->load($key)) {
    /* 重い処理でresult取得生成 */
    $cache->save($result, $key);
}