За последние 24 часа нас посетили 49128 программистов и 1758 роботов. Сейчас ищут 673 программиста ...

Кеширование результатов выполнения участка кода

Тема в разделе "PHP для новичков", создана пользователем HiTech, 14 фев 2008.

  1. HiTech

    HiTech Активный пользователь

    С нами с:
    14 фев 2008
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Нижний Новгород
    Необходимо реализовать кеширование результатов выполнения участка кода. Т.е. имеем что-то типа:

    PHP:
    1. некая функция
    2. {
    3.     $res1 = результат выполнения первого запроса к бд
    4.     $res2 = результат выполнения второго запроса к бд
    5.     $res3 = результат выполнения третьего запроса к бд
    6.     ...
    7.     обработка данных
    8.  
    9.     $final_result = array(
    10.         '1' => $res1,
    11.         '2' => $res2,
    12.         '3' => $res3
    13.     );
    14.  
    15.     return $final_result;
    16. }
    В результате получаем массив данных final_result который используется в другом месте для построения участка страницы. Как закешировать часть, в которой находится получение данных? Т.е. необходимо избежать запросов к бд в течении некоторго (заданного) отрезка времени. Пробовал гуглить, но нахожу только про кеширование страниц =(
     
  2. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Никак. Кешируй через файлы. То есть - пишешь результат в файл, в виде, который тебе удобен (например, xml). И при необходимости обойтись без базы - читаешь оттуда.
     
  3. Anonymous

    Anonymous Guest

    В сессию класть можно.
     
  4. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Удобную схему кеширования нашел в ZendFramework

    Состоит из 2 частей:

    1. Frontend - что кешируем
    - Данные по uid
    - Вывод
    - Страницы целиком
    - Функции
    - Объекты

    2. Backend - куда кешируем
    - в файлы
    - в Memcached
    - в SQLite
    - в APC (Alternative PHP Cache)
    - в ZendPlatform

    При желании, эти части можно заменить своими или дополнить существующие
     
  5. HiTech

    HiTech Активный пользователь

    С нами с:
    14 фев 2008
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Нижний Новгород
    Спасибо за помощь... Можно тогда ещё вопросик по поводу этого ZendFramework... На сколько я слышал эта штука платная? =)
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  7. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
  8. HiTech

    HiTech Активный пользователь

    С нами с:
    14 фев 2008
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Нижний Новгород
    Эх... Фреймворк конечно хорошо, но на сколько я понял они той же сериализацией пользуются... Тогда будем следовать совету RomanBush и писать в файлы сериализованные данные (думаю с ними работать будет быстрее чем с xml).

    Про memcache читал (ктати почему-то больше Xcache понравился) но не подходит, т.к. не думаю что у многих хостеров такая вещь стоит =(
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    А как на счёт кешировать всю таблицу в файл например так:
    PHP:
    1.  
    2. <?
    3. function get_serial($file){
    4. $buf=@file_get_contents($file.'.php');
    5. $buf=str_replace("<?die();?>","",$buf);
    6. return unserialize($buf);
    7. }
    8. function set_serial($file,$data){
    9.  if (file_exists($file.'.php')) {
    10.     unlink($file.'.php');
    11.     }
    12.     $fp = fopen($file.'.php', 'w');
    13.     fputs($fp, "<?die();?>".serialize($data));
    14.     fclose($fp);
    15. }
    16.  
    17. $cache=get_serial('cache');
    18.        if (!is_array($cahe)) {
    19.          $sql=// запрос в бд
    20.          $cache=array();
    21.          while($row=//помещаем результат запроса в массив) {
    22.               $cache[$row[id]]=array(); // задаём уникальный id для удобства можно использовать id из БД
    23.                foreach ($row as $key => $val)     {
    24.                   $cache[$row[id]][$key]=$val;
    25.                 }
    26.                set_serial('cache',$cache);
    27.          }
    28.      }
    29. ?>
    итого получили массив cache в котором храниться вся таблица
    [1]=>array([name]=>'blabla',[text]=>'123'),[2]=> и тд
     
  10. HiTech

    HiTech Активный пользователь

    С нами с:
    14 фев 2008
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Нижний Новгород
    Ну, вообще-то я так и хотел, но вот за идею с <?die();?> спасибо =) Как раз задумывался о том чтобы нельзя было простым запросом прочитать данные.
    Кстати, не рекомендуется пользоваться fopen с ключом 'w'... Лучше открывать как 'r+', потом лочить и обнулять ;) Иначе может получиться так, что кто-нибудь попадёт на пустой файл...