Эмуляция Memcache
В одной из статей я рассказывал о том, что такое MEMCACHE. Прикольная вещь, но не на всех хостингах она есть. По этому попробуем реализовать Эмуляцию Memcache.
Работать точно так же быстро ниже представленный код не будет, но всяко будет быстрее работать обычных обработок запросов SQL которые генерят потом большую тучу HTML кода :).
Как будет работать эмулятор:
1. Кеш будет храниться в файловой системе, а не в памяти сервера.
2. Для этого нам нужно будет указать папку, где будут храниться файлы данных, и они будут называться идентификатором кеш переменной
3. при передаче текстовой переменной, он ее будет сохранять в формате:
1123124124<-cache->текст переменной<-cache->string
4. при передаче массива, он ее будет сохранять в формате:
1123124124<-cache->сериализованный массив<-cache->array
Где:
«<-cache->» — разделитель текстовых данных
число — это время жизни в секундах
по середине — данные переменной
последнее — тип
Варианты сохранения вы можете запрограммировать сами. В данном примере только текст и массивы.
Для начала создадим файл memcache.php и поместим в него следующий код:
<?php $memcache=1; $dir = $_SERVER['DOCUMENT_ROOT'].'/UPLOAD/memcache/'; function memcache_set($active, $var, $val, $null, $time) { global $dir; $type = gettype($val); if (is_array($val)) $val = serialize($val); $fn = fopen($dir.$var,'w+'); fwrite($fn, (time() + $time)."<-cache->".$val."<-cache->".$type); fclose($fn); } function memcache_get($active, $var) { global $dir; if (is_file($dir.$var)) { $fn = fopen($dir.$var, 'r'); $data = fread($fn, filesize($dir.$var)); fclose($fn); $tmp = explode("<-cache->",$data); $time = $tmp[0]; $val = $tmp[1]; $type = isset($tmp[2]) ? $tmp[2] : 'string'; if ($type=='array') $val = unserialize($val); if ($time>time()) return $val; else return null; } else return null; } ?>
в переменную $dir устанавливаем директорию, где будут хранится файл кеша.
Использование:
$out = memcache_get($memcache, 'last_recipe'); if (!$out) { $all = $DB->getAll('SELECT * FROM mp_recipe_items ORDER BY id DESC LIMIT 10'); ob_start(); if (sizeof($all)) { echo '<div style="border: 1px solid #541302"></div>'; echo '<h3>Новые рецепты</h3>'; echo '<div style="width: auto; padding: 0px 5px 0px 15px;">'; foreach($all as $num => $item) { echo '<div align="left" style="line-height: 18px; margin-bottom: 4px;">'.($num+1).'. <a href="/kuhnya/recipe/'.$item['art_id'].'/'.$item['id'].'/">'.$item['title'].'</a></div>'; } echo '</div>'; echo '<div style="border: 1px solid #541302"></div>'; echo '<div align="center">Всего рецептов: <b>'.((int)$DB->getOne('SELECT count(*) FROM mp_recipe_items')).'</b></div>'; } $out = ob_get_clean(); memcache_set($memcache,'last_recipe', $out, 0, 3600*24*5); } echo $out;
Используются два метода:
string memcache_get($memcache,$var_name)
возвращает значение кеша по $var_name переменной
и метод записи в кеш:
void memcache_set($memcache,$var_name, $var_value, $null, $time)
$var_name — название переменной
$var_value — значение (string|array)
$null — просто 0, сделал по аналогии с оригинальным memcache
$time — время жизни кеша в секундах
Данный вариант и код не претендуют на качество и скорость, а просто показывает как можно ручками сделать кеширование и использовать на своем сайте для ускорения его работы.
А чем данный вариант принципиально отличается от обычного кеширования в плоских файлах?
Orion189 что за плоские файлы? тут как раз и показано на файлах + еще тема называется «Эмуляция», т.е. это на случай когда мемкеш не доступен например, а сайт уже расписан весь под мемкеш.
Я хотел сказать, что это лишь подобие мемкеша и никакого явного преимущества не дает (ну разве что удобство доступа к данным). А так — это обычное хранение данных в текстовых файлах, в то время как мемкеш хранит все данные в оперативной памяти.