Статьи про кэширование в PHP

Кэширование в PHP для меня до сих пор остаётся тёмной областью. Во многом это связано с том, что все статьи деляться на две категории:
1) Сейчас мы расскажем вам про буферизацию вывода...(до чего я и сам додумался :) )
2) Работа с memcache и нагруженные проекты(что превышает мои потребности на данный момент)

Между тем, посмотришь на коды различных CMS: там всё намного разнообразнее. Кроме кэширования целой страницы могут кэшироваться отдельные модули, результаты запросов, вот это всё меня и интересует больше всего. Но по коду осознать реализацию у меня не очень получается.

Теоретические то статьи я видел, практики бы, как это лучше писать, чтобы потом не пришлось переписывать, периодечески матерясь :)
  • Вопрос задан
  • 3601 просмотр
Пригласить эксперта
Ответы на вопрос 6
@immaculate
Программист-путешественник
Кэширование — это очень сложно. Если у вас вносятся изменения в БД, то появляется масса проблем с инвалидацией. Инвалидацию очень легко забыть где-нибудь вставить, даже если с этим помогает фреймворк/ORM.

Все «полностью автоматизированные» решения по кэшированию, создавали гигантские проблемы, потому что в каких-то случаях не инвалидировали кэш, когда нужно. Допустим, есть объект Profile со свойством balance. Пользователь покупает услуги, генерируется invoice, и либо баланс показывается закэшированный, либо инвойс не появляется в списке закэшированных инвойсов. Оба случая вызывают неистовое негодование пользователей, поверьте моему опыту.

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

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

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

В общем, готовых шаблонов на все случаи жизни нет. Только для read-only данных, и то с ограничениями. Задумываться о кэшировании желательно с самого начала реализации проекта, потом будет сложнее.
Ответ написан
Комментировать
Gibbzy
@Gibbzy
ну там несколько вообщем то своств у этого кэширования
куда скэшировать
-В файлики
-В память
-В базу данных (бывает и такое)
-Куда то еще (есть такие выдумки огоогоо)

Что скэшировать
— Результаты выполнения запросов (Что то в моделях)
— Готовый html (Прям вместе с запросами с явскриптом и со всем всем всем)
— Вообще кэшировать можно все что угодно любой объект который поддается сериализации

Остается только разобратся в каких случаях какую комбинацию стоит применять.

Механизм кэширования достаточно простой. Неважно какой у нас dataSource у нас есть интерфейс к любому мы его и используем (Так реализованно в Zend_Cache)

есть ключ есть значение, теги и время жизни кэша
К каждой паре ключ — значение мы можем присвоить тег и определенное время жизни
Теги нужны например чтобы по ним чистить кэш. (Опять же так реазизованно в Zend_Cache)

алгоритм простой:
Смотрим по ключу есть ли такое значение в кэше если есть получаем его, если нет получаем откуда то еще и засовываем в кэш.

Ключ можно составлять по разным принципам начиная от id какого ли бо объекта или id + еще id + еще id
или вообще можно использовать хэш от sql запроса.

Прочитайте про memcache, если вам нужно что то более мелкоколиберное попробуйте APC, ну и вообще все можно в файликах хранить на всякий случай. С файликами аккуратнее у меня однажды была история когда кэш занял все дисковое пространство, в результате моей ошибки.

Вообщем такие вот дела, ничего сложного, удачи!
Ответ написан
Комментировать
sadist007
@sadist007
Методы кеширования очень сильно зависят от ситуации. Если в одном случае положить результат запроса в memcache — добро, то в другом — это будет явное зло. А вот случаев может быть великое множество… Тут только практика.

По идее тут может помочь что-то вроде «обертки» вокруг методов кеширования. Поставил в настройках memcache, поглядел как работает. Потом поменял на memcachedb, например, и снова посмотрел… Ну а по результатам уже конкретный метод кеширования для конкретного случая выбирать.
Ответ написан
Комментировать
MTonly
@MTonly
Веб-разработчик с 2002 года
Посмотрите в сторону Zend_Cache.
Ответ написан
slang
@slang
Вам нужно взять существующий код и посмотреть как это делают другие. Хорошее кеширование на мой взгляд у Zend_Cache и ADODB, также PEAR_Cache, ну и код хороший. Не имеется ввиду взять за основу, а прочитать и понять как.
Ответ написан
Комментировать
@Jazzist
Еще кешируются сериализованные результаты запросов выборок из БД. На уровне приложения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы