このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0236

Memcached

 サーバ・クライアント型であるオープンソースのキャッシュサーバ 「Memcached」」 を利用したデータキャッシングの利用方法を解説します。

 CodeIgniterでMemcachedにアクセスするには、PECL拡張モジュールである「memcached.so」
モジュールを利用します。
 そのため、PHPのバージョンは「5.2.0」以上でないと利用できません。

Memcachedモジュールのインストール

 CentOS等のRedHat系Linux(ver5)で、Memcached拡張モジュールをインストールする参考手順です。

    # rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
    # rpm -ivh http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm
    # yum install libmemcached.x86_64 libmemcached-devel.x86_64 zlib-devel
    # rpm -qa |grep libmemcached
    libmemcached-devel-1.0.4-3.el5
    libmemcached-1.0.4-3.el5
    # yum install php-pear pcre-devel
    # pecl install memcached-1.0.2
    

Memcachedモジュールの設定

 Memcached拡張モジュールを有効にするためのPHPの設定です。

設定ファイル

  • /etc/php.d/memcached.ini
  • extension=memcached.so
    

動作確認

    $ php -i | grep memcached
    memcached support => enabled
    libmemcached version => 1.0.4

Memcachedドライバの設定

 Memcachedサーバにアクセスするための CodeIgniter の設定です。

hostname Memcachedサーバのホスト名または、IPアドレスを指定します。
port MemcachedサーバのTCPポート番号を指定します。
weight 複数のMemcachedサーバを利用する場合、対象のサーバの重みを指定します。
  • config/memcached.php
  • <?php
    
    $config['memcached'] = array(
        'server1' => array(
            'hostname' => '10.0.0.101',
            'port'  => 11211,
            'weight'  => 70,
        ),
        'server2' => array(
            'hostname' => '10.0.0.102',
            'port'  => 11211,
            'weight'  => 30,
        ),
    );
    
    // 上の例では70%の確率で「server1」、30%の確率で「server2」に接続されます。

 本番環境、テスト環境、開発環境ごとにMemcachedサーバを分けて設定することができます。

    • config/development/memcached.php
    • config/testing/memcached.php
    • config/production/memcached.php

Memcachedドライバのロード

 「LOAD」オブジェクトの「driver()」メソッドで、Memcachedドライバをロードします。

 第一引数に「cache」を指定し、第二引数には連想配列で、利用したいキャッシュドライバと それが利用できなかった場合の予備のキャッシュドライバを指定します。

    $this->load->driver('cache', array('adapter' => 'memcached', 'backup' => 'file'));
    

Memcachedドライバの機能

 キャッシュドライバの機能は、主に「キャッシュ情報の取得」、 「キャッシューデータのセット」、
「キャシュデータの削除」の3種類です。

is_supported('memcached') 一番上に戻る

 指定したキャッシュドライバがシステムで利用できるか確認します。
 指定したキャッシュドライバが利用できる場合は「TRUE」、 利用できない場合は「FALSE」を返します。

    $this->load->driver('cache', array('adapter' => 'memcached'));
    
    if ($this->cache->is_supported('memcached')) {
        // Memcached キャッシングの利用が可能です。
    }
    else {
        // Memcached キャッシングは利用できません。
    }
    

cache_info() 一番上に戻る

 キャッシング情報を返します。
 返すデータはキャッシュドライバによって異なります。

    echo var_export($this->cache->cache_info(), TRUE);
    
    array (
      'localhost:11211' => 
      array (
        'pid' => -1,
        'uptime' => 0,
        'threads' => 0,
        'time' => 0,
        'pointer_size' => 0,
        'rusage_user_seconds' => 0,
        'rusage_user_microseconds' => 0,
        'rusage_system_seconds' => 0,
        'rusage_system_microseconds' => 0,
        'curr_items' => 0,
        'total_items' => 0,
        'limit_maxbytes' => 0,
        'curr_connections' => 0,
        'total_connections' => 0,
        'connection_structures' => 0,
        'bytes' => 0,
        'cmd_get' => 0,
        'cmd_set' => 0,
        'get_hits' => 0,
        'get_misses' => 0,
        'evictions' => 0,
        'bytes_read' => 0,
        'bytes_written' => 0,
        'version' => '',
      ),
    )
    
    

save($key, $val, $ttl) 一番上に戻る

 キャッシュしたいデータをセットします。
 第一引数には、データを識別する「キー」を指定し、
 第二引数には、データを指定します。
 第三引数は、データをキャッシュする時間を秒単位で指定することができます。
 第三引数を指定しなかった場合のデフォルトは「60」となります。

    $id = $this->input->post('id');
    
    if ($my_data = $this->sample_model->get($id)) {
        
        $this->cache->save("my_data_{$id}", $my_data, 600);
        
    }
    

get($key) 一番上に戻る

 事前にキャッシュしたデータを取得します。
 引数には、キャッシュしたデータを識別する「キー」を指定します。

    $id = $this->input->post('id');
    
    if (! $my_data = $this->cache->get("my_data_{$id}")) {
    
        if ($my_data = $this->sample_model->get($id)) {
    
            $this->cache->save("my_data_{$id}", $my_data, 600);
    
        }
    
    }
    return $my_data;
    

get_metadata($key) 一番上に戻る

 引数で指定した「キー」のキャッシュデータ情報を返します。

expireこのキャッシュデータが削除される時間
mtimeこのキャッシュデータがセットされた時間
dataキャッシュされたデータ
    $this->cache->save('aaa', 'AAA', 600);
    
    echo var_export($this->cache->get_metadata('aaa'), TRUE);
    
    
    false
    
    

delete($key) 一番上に戻る

 引数で指定した「キー」のキャッシュデータをキャッシュから削除します。

    if ($this->cache->delete('aaa')) {
        // キャッシュデータを削除しました。
        echo var_export($this->cache->get_metadata('aaa'), TRUE);
        // false 
    }
    else {
        // キャッシュデータの削除に失敗しました。
    }
    

clean() 一番上に戻る

 全てのキャッシュデータを削除します。

    if ($this->cache->clean()) {
        // キャッシュデータを削除しました。
    }
    else {
        // キャッシュデータの削除に失敗しました。
    }