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