За последние 24 часа нас посетили 38024 программиста и 1811 роботов. Сейчас ищут 889 программистов ...

Кеширование запроса

Тема в разделе "PHP для новичков", создана пользователем maragonov, 25 июн 2015.

  1. maragonov

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

    С нами с:
    25 июн 2015
    Сообщения:
    13
    Симпатии:
    0
    Функции кеша: (запись \ чтение)

    Код (PHP):
    1. function create_cache($prefix, $cache_text) {
    2.         $filename = ENGINE_DIR.'/cache/'.$prefix.'.tmp';
    3.         $fp = fopen($filename, 'wb+');
    4.         fwrite($fp, $cache_text);
    5.         fclose($fp);
    6.         @chmod($filename, 0666);
    7. }
    8. function view_cache($prefix) {
    9.         $filename = ENGINE_DIR.'/cache/'.$prefix.'.tmp';
    10.         return @file_get_contents($filename);
    11. } 
    + serilize / unserialize

    Такой штукой кеширую блоки у пользователей сайта (информацию и прочее).
    Возможно ли закешировать постраничную навигацию?
    Например вытаскиваю все фотографии или же аудиозаписи постранично.


    Пример кеширования данных пользователя:

    Код (PHP):
    1. $id = intval($_GET['id']); //ID пользователя
    2. $row = unserialize(view_cache('profile_'.$id)); //Смотрим кэш
    3. if(!$row){ //Проверяем на наличие кеша, если нету то выводи из БД и создаём его
    4. $row = $db->super_query("SELECT * FROM `users` WHERE `user_id` = '".$id."'");
    5. if($row){
    6. create_cache('profile_'.$id, serialize($row)); // Создаём кеш
    7. }
    8. } else { //Кеш есть - вытаскиваю
    9. echo $row['user_login'];
    10. } 
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Кешировать всё что угодно можно. Для результатов запроса я бы брал в качестве ключа md5 запроса. Вроде же
    это у вас dle, а там можно кучу примеров найти кеширования всего запроса. Или вы решили свою систему кеша написать поверх стандартной? Функции кеширования не узнаю, а вот super_query - точно оттуда
     
  3. maragonov

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

    С нами с:
    25 июн 2015
    Сообщения:
    13
    Симпатии:
    0
    Это не дле, классы оттуда.
    Можно конечно не md5 взять а serialize. $cache = serialize($row);
    При постраничной навигации берём же через LIMIT N, Z;
    И имя файла сделать к примеру cache_N_Z.dat
    Не поплывёт ли пагинация (вывод всех строк постранично) при новых записях если так сделать?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не, вы меня не поняли. Всё очень просто. Вот у вас есть запрос "select .... from .... limit 2, 10" - вот всё вот это вы превращаете в ключ кеша, через md5, к примеру.
     
  5. maragonov

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

    С нами с:
    25 июн 2015
    Сообщения:
    13
    Симпатии:
    0
    1. Если я правильно понял, то:
    Код (PHP):
    1. $sql = "SELECT ... LIMIT 2,10";
    2. $key = md5($key);
    3. $row = $db->quper_query($sql);
    4. if($row){
    5. //Пляшем с бубнами дальше..
    6. } 
    2. Не поплывёт ли пагинация (вывод всех строк постранично) при новых записях если так сделать?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    При новых записях кеш стирается
     
  7. maragonov

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

    С нами с:
    25 июн 2015
    Сообщения:
    13
    Симпатии:
    0
    Просто у меня форум и я думаю как это правильно организовать.
    И стоит ли вообще кешировать.
    :: Получается, если 100 страниц в базе - 99 из них мы предположим закешировали, при новом сообщении стирается весь кеш из 100 страниц и рисуется новый, на генерируюмую страницу т.е последнюю. (если я правильно понял).. Смысл тогда в этом кеше? Или я что-то не так понял, поправьте меня, если это так.
    Просто я не знаю, как организована кеш система на остальных форумах (Если есть примеры из теории - было бы здорово)
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Смысл в том, что запрашиваются страницы из базы чаще, чем появляются новые обычно. Поэтому прирост производительности кеш всё равно даст. Любое изменение базы данных - это повод стереть кеш. А стирать ли весь, или какой-то определённый - это уже как организуете. Там можно много вариантов придумать.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    да сто́ит.
    это уж как ты заложишь. упрощенно: что ты объявишь ключём кеша, то и будет стираться — либо одна страница, либо сразу пучёк.
    на остальных форумах она фигово организована :) есть повод отличиться.

    рекомендую изучить
    https://github.com/php-fig/fig-standards/blob/master/proposed/cache.md
    http://www.stashphp.com/
    хотябы для того, чтобы знать термины