Кэш, страшное слово, или все намного проще чем кажется?

 

Всем добрый день! Спасибо что заглянули на мой блог. Сейчас будет поток мыслей (одним словом бред) по поводу того в чем я не очень хорошо понимаю, но тем не менее поговорить сам собой (а может и с кем то) поможет мне немного подумать "А правильно ли я реализовал php кэшированиена своем блоге?". Вообще все началось с того, что я решил посмотреть сколько запросов делает мой блог в базу данных.

 

 

Почему я задумался о кэширование страниц?

 

На эту мысль меня с подвигли результаты мини анализа, который я провел совсем недавно. Я проверил сколько тратится sql запросов у меня на блоге, и на чистом вордпрессе, вот что получилось

При генерации главной страницы моего блога (Включены все модули что есть на блоге) скрипт делает 19 запросов. У вордпресса такие же затраты - 19 запросов в базу данных

 

загрузка главной страницы

 

Далее я посмотрел сколько делает запросов страница с текстом. Мой блог делает 20 запросов, вордпресс - 23

 

загрузка страницы поста

 

Цифры конечно могут быть не точными, но тем не менее мне не особо нравится, что мало функциональный движок (это я про свой) тяжелее, или на ровне с, много функциональным.

Но что поделать? Избавится от лишних запросов удаляя их, значит убить напрочь весь движок, разве не так?

 

Что такое php кэширование?

 

После проведенного мной анализа, я начал искать способ решения данной проблемы. Лекарство от данного недуга есть, и называется оно кэширование.

Я не даром назвал заметку "Кэш, страшное слово, или все намного проще чем кажется?" ибо слово кэш, меня пугает своей не понятностью. Нет, я приблизительно знаю, что такое кэш, но на подсознательном уровне думаю, что не все так просто как мне кажется.

За точной информацией я естественно полез в интернет. Немного покопал, и как всегда нашел море умных и не понятных слов. Мне вот интересует вопрос, для кого пишутся эти заумные тексты? Как мне кажется для тех кто профи в программирование, а именно для тех кто не читает материал тех, кто их пишет. Хотя я скорее всего тоже такой, море умных слов и не понятно, что к чему... Тем не менее я понял одну вещь.

Кэширование - это ничто иное как сохранения результата работы скрипта в отдельный файл, который помещается на сервере. В следующий раз когда кто-нить обратится к этой же странице, скрипт выдаст сохраненную копию, а не полезет за информацией в базу данных, тем самым сокращается количество SQL запросов, а значит повышается производительность.

Как в принципе я и думал. Но мне все равно кажется, что эта информация не полная или же не верная.

 

Когда обновлять кэш файл?

 

Все это очень хорошо, увеличения производительности и тому подобное, но вот есть одна маленькая проблема. Как сообщить скрипту, что страница поменялась, то есть когда обновлять сохраненный файл? Все из тех же умных и не понятных слов нашел два варианта создания механизма кэширования

  • Писать алгоритм, который с определенным временным промежутком будет обновлять копию кэша.
  • Посылать какие то html заголовки, сверяя с их помощью копию страницы с копией страницы в кэше, и в случае разных дат обновлять кэш

Первый способ вроде более менее понятен, а вот со вторым я так и не разобрался. Да и скорее всего не получилось бы прибегнуть к этому способу, ибо, я так прикинул, в случае сравнения дат в заголовках, придется писать специальный код, который будет в определенных ситуациях обновлять эти даты. А мне лень писать такой код =)

 

Что именно необходимо закэшировать?

 

Прежде чем придумывать механизм сохранения и обновления файлов, решил подумать над тем, что необходимо кэшировать? Сохранять всю страницу целиком я сразу же отказался, может это и самый экономный способ, но в этом случае откажут совершенно все модули, которые обновляются с каждым перезапуском страницы. Подумав решил, что в кэш отправятся все, что очень жирное (слишком много запросов) и все, что обновляется раз в 100500 лет. Такая возможность имеется, так как движок состоит из отдельных функций, результат которых, в большинстве случаев, html код, который можно сохранить в файл и отправить на сервер.

Подумав я решил, что отправлю в кэш заголовки, мета теги и почти весь сайтбар (кроме модуля меню) Этого достаточно чтобы сократить запросы приблизительно вдвое

 

Мой криворукий способ кэширования страниц

 

Почему криворукий? Потому что способ распознания устаревших копий слишком уж "не умный", до более умного способа я не додумался...

Мета теги, заголовки и модуль читаемых постов меняется не очень часто, поэтому их сохраненные копии обновляются раз в час. Этого не сложно добиться, примеров в интернете полно!

А вот кэш модуля последних комментариев, опроса и последних постов обновляется только тогда когда произойдет изменения в базе данных. Как я определяю изменения? Все очень даже просто и не профессионально.

В корне блога лежит текстовой файл, в котором находится строчка вот такого вида:

1|1|0|0|0|1

Мой движок превращает эту строчку в массив. Каждая цифра в массиве отвечает за определенный модуль.

  • Если стоит ноль, значит кэш модуля устарел и его необходимо заменить
  • Если стоит единица, значит кэш актуален, и его не нужно обновлять.

Изменения этой строчки производятся во время добавления поста в базу данных, или добавления комментария, тем самым движок понимает, что кэш нужно заменить. Не правда ли "криворукий способ" а?

Тем не менее запросы на главной странице упали до 10-ти, а на страницах с заметками до 9-ти.

 

запросы с кэшированием страниц

 

Добился сокращения SQL запросов в двое, есть чему радоваться, если не считая того, что используется неадекватный способ определения жизни файлов...

В общем заканчиваю монолог в надежде, что способ не такой уж и глупый....

Всем всего доброго! До встречи!

 

Возможно Вам будут интересны следующие заметки

Комментарии (3)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Светозарка, 12 Мая 2012 г. 13:57 пишет:
Гость
Конечно теория хороша, но как на практике? Не проще ли не данные на выходе хешировать, а запросы?
Rio-Shaman, 12 Мая 2012 г. 16:55 пишет:
Автор
Может и проще.. Я же говорил, что заметка является потоком мыслей по поводу того, в чем я не очень хорошо понимаю..
Ответ для пользователя: Светозарка
Andrew, 06 Октября 2012 г. 15:55 пишет:
Читатель
А как определить программно расход памяти? В двух словах, если не трудно?