在CakePHP2中使用缓存的示例

以下是安装Memcached后的配置示例。

引导.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;

示例.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 はシステム全体として重複しないように注意する。

如果从模型中使用


/**
     * モデル関数サンプル
     * @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;
    }

如果从组件中使用的话



  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;
    }

广告
将在 10 秒后关闭
bannerAds