Необходимо реализовать кеширование результатов выполнения участка кода. Т.е. имеем что-то типа: PHP: некая функция { $res1 = результат выполнения первого запроса к бд $res2 = результат выполнения второго запроса к бд $res3 = результат выполнения третьего запроса к бд ... обработка данных $final_result = array( '1' => $res1, '2' => $res2, '3' => $res3 ); return $final_result; } В результате получаем массив данных final_result который используется в другом месте для построения участка страницы. Как закешировать часть, в которой находится получение данных? Т.е. необходимо избежать запросов к бд в течении некоторго (заданного) отрезка времени. Пробовал гуглить, но нахожу только про кеширование страниц =(
Никак. Кешируй через файлы. То есть - пишешь результат в файл, в виде, который тебе удобен (например, xml). И при необходимости обойтись без базы - читаешь оттуда.
Удобную схему кеширования нашел в ZendFramework Состоит из 2 частей: 1. Frontend - что кешируем - Данные по uid - Вывод - Страницы целиком - Функции - Объекты 2. Backend - куда кешируем - в файлы - в Memcached - в SQLite - в APC (Alternative PHP Cache) - в ZendPlatform При желании, эти части можно заменить своими или дополнить существующие
Спасибо за помощь... Можно тогда ещё вопросик по поводу этого ZendFramework... На сколько я слышал эта штука платная? =)
Эх... Фреймворк конечно хорошо, но на сколько я понял они той же сериализацией пользуются... Тогда будем следовать совету RomanBush и писать в файлы сериализованные данные (думаю с ними работать будет быстрее чем с xml). Про memcache читал (ктати почему-то больше Xcache понравился) но не подходит, т.к. не думаю что у многих хостеров такая вещь стоит =(
А как на счёт кешировать всю таблицу в файл например так: PHP: <? function get_serial($file){ $buf=@file_get_contents($file.'.php'); $buf=str_replace("<?die();?>","",$buf); return unserialize($buf); } function set_serial($file,$data){ if (file_exists($file.'.php')) { unlink($file.'.php'); } $fp = fopen($file.'.php', 'w'); fputs($fp, "<?die();?>".serialize($data)); fclose($fp); } $cache=get_serial('cache'); if (!is_array($cahe)) { $sql=// запрос в бд $cache=array(); while($row=//помещаем результат запроса в массив) { $cache[$row[id]]=array(); // задаём уникальный id для удобства можно использовать id из БД foreach ($row as $key => $val) { $cache[$row[id]][$key]=$val; } set_serial('cache',$cache); } } ?> итого получили массив cache в котором храниться вся таблица [1]=>array([name]=>'blabla',[text]=>'123'),[2]=> и тд
Ну, вообще-то я так и хотел, но вот за идею с <?die();?> спасибо =) Как раз задумывался о том чтобы нельзя было простым запросом прочитать данные. Кстати, не рекомендуется пользоваться fopen с ключом 'w'... Лучше открывать как 'r+', потом лочить и обнулять Иначе может получиться так, что кто-нибудь попадёт на пустой файл...