CakePHP2でのキャッシュ利用サンプル

# Memcachedをインストールした後の設定サンプルです。


## bootstrap.php

以下の設定を追加する。

```php

<?php

$cache_default_prefix ='my_app';//自由に設定（本番とテストを分岐することも可能）

//Memcached 設定
Cache::config('default', array(
    'engine' => 'Memcached',
    'duration' => 3600, //キャッシュの有効時間（秒）
    'probability' => 100, //キャッシュ再作成率 100%
    'prefix' => $cache_default_prefix,
    'servers' => array('***.***.***.***:11211'),
    'persistent' => true,
    'compress' => false,
));

Cache::config('long', array(
    'engine' => 'Memcached',
    'duration' => 3600 * 24, //キャッシュの有効時間（秒）
    'probability' => 100, //キャッシュ再作成率 100%
    'prefix' => $cache_default_prefix,
    'servers' => array('***.***.***.***:11211'),
    'persistent' => true,
    'compress' => false,
));

//セッションセパレータ
define('SS', '_');

```

## SELinux の設定

クライアント側のSEINUX で以下を許可する

```
allow httpd_t memcache_port_t:tcp_socket name_connect;
```


## sample.php

```php

<?php

//1時間キャッシュ
public function cache_sample(int $param1,int $param2,$flag_use_cache=true): array
{
    $cache_name = $this->cache_name();
    $cache_name .= SS. $param1 . SS . $param2;
    $results = $this->get_cache($cache_name,$flag_use_cache);
    if (!$results) {


        .....

        Cache::write($cache_name, $results);
    }
    return $results;
}


//1日間キャッシュ(一次元配列パラメータ対応)
public function long_cache_sample(array $param1,int $param2,$flag_use_cache=true): array
{
    $cache_name = $this->cache_name();
    $cache_name .= SS. implode(SS,$param1)  . SS . $param2;
    $results = $this->get_cache($cache_name,$flag_use_cache,'long');
    if (!$results) {

        .....

        Cache::write($cache_name, $results,'long');
    }
    return $results;
}


//強制的に更新したい場合は $flag_use_cache=false にして呼び出す。
protected function get_cache(string $cache_name,bool $flag_use_cache, string $config = 'default' ){
  $results = Cache::read($cache_name,$config);
  if(!$flag_use_cache && $results){
    Cache::delete($cache_name,$config);
    $results=[];
  }
  return $results;
}

/**
 * @return string
 */
public function cache_name()
{
    $debug = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
    return strtolower(Inflector::slug(basename($debug[1]['class'])) . SS . $debug[1]['function']);
}


```
- 引数が配列の場合は implode（）で文字列に変換する。（但し多次元配列は対応不可。）
- $cache_name はシステム全体として重複しないように注意する。

## モデルから利用する場合

```php

/**
     * モデル関数サンプル
     * @param int $param
     * @return float
     */
    public function model_cache(int $param): float
    {
        $AppController = new AppController();
        $cache_name = $AppController->cache_name() . SS
        . $param;
        $results = $AppController->get_cache($cache_name);
        if ($results === false) {

            .....

            Cache::write($cache_name, $results);
        }
        return $results;
    }
```


## コンポーネントから利用する場合

```php


  function initialize(Controller $controller)
  {
      $this->controller = $controller;
  }

  public function component_sample(int $id): array
  {
        $cache_name = $this->controller->cache_name();
        $cache_name .= SS . $id;
        $results = $this->controller->get_cache($cache_name, $flag_use_cache);
        if (!$results) {

            ...

            Cache::write($cache_name, $results);
        }
        return $results;
    }

```