PageRenderTime 54ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/baser/models/behaviors/bc_cache.php

https://github.com/hashing/basercms
PHP | 160 lines | 70 code | 15 blank | 75 comment | 11 complexity | 068dc6724e938070b7c23c7d384f3e56 MD5 | raw file
Possible License(s): MIT
  1. <?php
  2. /* SVN FILE: $Id$ */
  3. /**
  4. * キャッシュビヘイビア
  5. *
  6. * PHP versions 5
  7. *
  8. * baserCMS : Based Website Development Project <http://basercms.net>
  9. * Copyright 2008 - 2012, baserCMS Users Community <http://sites.google.com/site/baserusers/>
  10. *
  11. * @copyright Copyright 2008 - 2012, baserCMS Users Community
  12. * @link http://basercms.net baserCMS Project
  13. * @package baser.models.behaviors
  14. * @since baserCMS v 0.1.0
  15. * @version $Revision$
  16. * @modifiedby $LastChangedBy$
  17. * @lastmodified $Date$
  18. * @license http://basercms.net/license/index.html
  19. */
  20. /**
  21. * キャッシュビヘイビア
  22. *
  23. * @subpackage baser.models.behaviors
  24. */
  25. class BcCacheBehavior extends ModelBehavior {
  26. /**
  27. * setup
  28. *
  29. * @param Model $model
  30. * @param array $config
  31. * @return void
  32. * @access public
  33. */
  34. function setup(&$model, $config = array()) {}
  35. /**
  36. * キャッシュ処理
  37. *
  38. * @param Model $model
  39. * @param int $expire
  40. * @param string $method
  41. * @args mixed
  42. * @return mixed
  43. * @access public
  44. */
  45. function readCache(&$model, $expire, $type, $query = array()){
  46. static $cacheData = array();
  47. // キャッシュキー
  48. $tableName = $model->tablePrefix.$model->table;
  49. $cachekey = $tableName . '_' . $type . '_' . $expire . '_' . md5(serialize($query));
  50. // 変数キャッシュの場合
  51. if(!$expire){
  52. if (isset($cacheData[$cachekey])) {
  53. return $cacheData[$cachekey];
  54. }
  55. if (!$db =& ConnectionManager::getDataSource($model->useDbConfig)) {
  56. return false;
  57. }
  58. $results = $db->read($model, $query);
  59. $cacheData[$cachekey] = $results;
  60. return $results;
  61. }
  62. // サーバーキャッシュの場合
  63. $results = Cache::read($cachekey, '_cake_data_');
  64. if($results !== false){
  65. if($results == "{false}") {
  66. $results = false;
  67. }
  68. return $results;
  69. }
  70. if (!$db =& ConnectionManager::getDataSource($model->useDbConfig)) {
  71. return false;
  72. }
  73. $results = $db->read($model, $query);
  74. Cache::write($cachekey, ($results === false)? "{false}" : $results, '_cake_data_');
  75. // クリア用にモデル毎のキャッシュキーリストを作成
  76. $cacheListKey = get_class($model) . '_dataCacheList';
  77. $list = Cache::read($cacheListKey);
  78. $list[$cachekey] = 1;
  79. Cache::write($cacheListKey, $list);
  80. return $results;
  81. }
  82. /**
  83. * キャッシュを削除する
  84. *
  85. * @param Model $model
  86. * @return void
  87. * @access public
  88. */
  89. function delCache(&$model){
  90. $cacheListKey = get_class($model) . '_dataCacheList';
  91. $list = Cache::read($cacheListKey);
  92. if(empty($list)) return;
  93. foreach($list as $key => $tmp){
  94. Cache::delete($key, '_cake_data_');
  95. }
  96. Cache::delete($cacheListKey, '_cake_data_');
  97. }
  98. /**
  99. * afterSave
  100. *
  101. * @param Model $model
  102. * @param boolean $created
  103. * @return void
  104. * @access public
  105. */
  106. function afterSave(&$model, $created) {
  107. $this->delAssockCache($model);
  108. }
  109. /**
  110. * afterDelete
  111. *
  112. * @param Model $model
  113. * @return void
  114. * @access public
  115. */
  116. function afterDelete(&$model) {
  117. $this->delAssockCache($model);
  118. }
  119. /**
  120. * 関連モデルを含めてキャッシュを削除する
  121. *
  122. * @param Model $model
  123. * @return void
  124. * @access public
  125. * @todo 現在、3階層まで再帰対応。CakePHPのrecursiveの仕組み合わせたい
  126. */
  127. function delAssockCache(&$model, $recursive = 0) {
  128. $this->delCache($model);
  129. if($recursive <= 3) {
  130. $recursive++;
  131. $assocTypes = array('hasMany', 'hasOne', 'belongsTo', 'hasAndBelongsToMany');
  132. foreach($assocTypes as $assocType) {
  133. if($model->{$assocType}) {
  134. foreach($model->{$assocType} as $assoc) {
  135. $className = $assoc['className'];
  136. if(isset($model->{$className})) {
  137. $this->delAssockCache($model->{$className}, $recursive);
  138. }
  139. }
  140. }
  141. }
  142. }
  143. }
  144. }
  145. ?>