Задать вопрос

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

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

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

Теоретические то статьи я видел, практики бы, как это лучше писать, чтобы потом не пришлось переписывать, периодечески матерясь :)
  • Вопрос задан
  • 3602 просмотра
Подписаться 10 Оценить 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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
Еще кешируются сериализованные результаты запросов выборок из БД. На уровне приложения.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽