00001 <?php
00002
00003
00004
00005
00006
00007
00008 class MemcacheCacheItem implements ICacheItem {
00009
00010
00011
00012
00013
00014 private $item_data;
00015
00016
00017
00018
00019
00020
00021 public function __construct($item_data) {
00022 $this->item_data = $item_data;
00023 }
00024
00025
00026
00027
00028
00029
00030 public function get_creationdate() {
00031 return $this->item_data['creationdate'];
00032 }
00033
00034
00035
00036
00037
00038
00039 public function get_expirationdate() {
00040 return $this->item_data['expirationdate'];
00041 }
00042
00043
00044
00045
00046
00047
00048 public function get_data() {
00049 return $this->item_data['data'];
00050 }
00051
00052
00053
00054
00055
00056
00057 public function get_content_plain() {
00058 $ret = $this->get_content_compressed();
00059 if ($ret && function_exists('gzinflate')) {
00060 $ret = gzinflate($ret);
00061 }
00062 return $ret;
00063 }
00064
00065
00066
00067
00068
00069
00070 public function get_content_compressed() {
00071 return $this->item_data['content'];
00072 }
00073 }
00074
00075
00076
00077
00078
00079
00080
00081 class CacheMemcacheImpl implements ICachePersister {
00082
00083
00084
00085 public function is_cached($cache_keys) {
00086 $key = $this->flatten_keys($cache_keys);
00087 return (GyroMemcache::get($key) !== false);
00088 }
00089
00090
00091
00092
00093
00094
00095
00096 public function read($cache_keys) {
00097 $key = $this->flatten_keys($cache_keys);
00098 $ret = GyroMemcache::get($key);
00099 if ($ret) {
00100 $ret = new MemcacheCacheItem($ret);
00101 }
00102 return $ret;
00103 }
00104
00105
00106
00107
00108
00109
00110
00111 public function store($cache_keys, $content, $cache_life_time, $data = '', $is_compressed = false) {
00112 if (!$is_compressed) {
00113 if (function_exists('gzdeflate')) {
00114 $content = gzdeflate($content, 9);
00115 }
00116 }
00117 $data = array(
00118 'content' => $content,
00119 'data' => $data,
00120 'creationdate' => time(),
00121 'expirationdate' => time() + $cache_life_time
00122 );
00123 $key = $this->flatten_keys($cache_keys);
00124 GyroMemcache::set($key, $data, $cache_life_time);
00125 }
00126
00127
00128
00129
00130
00131
00132 public function clear($cache_keys = NULL) {
00133 if (empty($cache_keys)) {
00134 $this->do_clear(array());
00135 }
00136 else {
00137 $this->do_clear($cache_keys);
00138 }
00139 }
00140
00141
00142
00143
00144 protected function do_clear($cache_keys) {
00145
00146
00147
00148
00149
00150
00151 $cleaned = $this->preprocess_keys($cache_keys, false);
00152 $ns = $this->get_keys_namespaces($cleaned);
00153 $n = array_pop($ns);
00154 if ($n) {
00155
00156
00157 GyroMemcache::increment($n, 1);
00158 }
00159 }
00160
00161
00162
00163
00164
00165
00166 protected function flatten_keys($cache_keys) {
00167 $cache_keys = $this->preprocess_keys($cache_keys);
00168 $ns_keys = $this->get_keys_namespaces($cache_keys);
00169
00170 $tmp = array();
00171 foreach($cache_keys as $key) {
00172 $tmp[] = $key . ':=' . $this->get_namespace_value(array_shift($ns_keys));
00173 }
00174
00175 return implode('_', $tmp);
00176 }
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 protected function get_keys_namespaces($cache_keys) {
00187 $ret = array();
00188 foreach(Arr::force($cache_keys, true) as $key) {
00189 $ns_key .= 'g$ns' . $key;
00190 $ret[] = $ns_key;
00191 }
00192 return $ret;
00193 }
00194
00195
00196
00197
00198 protected function preprocess_keys($cache_keys, $strip_empty = true) {
00199 $cleaned = array($this->get_app_key());
00200 if ($strip_empty) {
00201 foreach(Arr::force($cache_keys, false) as $key) {
00202 if ($key || $key == '0') {
00203 $cleaned[] = $key;
00204 }
00205 else {
00206 break;
00207 }
00208 }
00209 }
00210 else {
00211 $cleaned = array_merge($cleaned, Arr::force($cache_keys, true));
00212 }
00213 return $cleaned;
00214 }
00215
00216
00217
00218
00219
00220
00221 private function get_app_key() {
00222 return Config::get_url(Config::URL_DOMAIN);
00223 }
00224
00225
00226
00227
00228
00229
00230 private function get_namespace_value($ns) {
00231 $ret = GyroMemcache::get($ns);
00232 if ($ret === false) {
00233
00234 $ret = rand(1, 1000);
00235 if (!GyroMemcache::add($ns, $ret, 0)) {
00236 $ret = GyroMemcache::get($ns);
00237 }
00238 }
00239 return $ret;
00240 }
00241
00242
00243
00244
00245 public function remove_expired() {
00246
00247 }
00248
00249 }