Почитайте,
optimization.guide и вот вам немного теории:
Кешировать можно:
- целиком всю страницу (для каждой страницы своя запись в кеше)
- отдельные части сайта
Кешировать можно в файлах:
- генераруя готового html
- генерируя html+php, так работают smarty и прочие шаблонизаторы собирая множество шаблонов в один
- в виде бинарного содержимого, сюда и готовый html и готовые значения вычислений и прочее
- в виде сериализованного массива с чем угодно, от предыдущего пункта отличается только форматом хранения
Кешировать можно в базе:
- в mysql/postgresql и прочих SQL - будет храниться на диске и горячие данные в памяти
- в mysql/postgresql и прочих SQL в in-memory таблицах - будет храниться в оперативке, но без дополнительных усилий кеш пропадёт при рестарте сервера
- в in-memory базах данных, часто это memcache, redis и прочее - опять таки выключили сервер - данные пропали
- в in-memory базах данных с сохранением на диск, это Tarantool, memcachedb и прочие если там заявлена такая функциональность
Так же можно:
- кешировать всё кроме вставок динамики
- кешировать куски вставляя их в динамику
Это два противоположных подхода которые при особом желании можно смешивать в рамках одного проекта.
Обновлять кеш можно:- при каждом запросе проверяя что старый кеш устарел
- предкеширование - отдельным кроном/демоном/сервисом генерировать кеш раз в N минут
- по мере изменения данных сбрасывать кеш и следующий запрос сгенерирует новый
- по мере изменения данных сбрасывать кеш путём генерации сразу нового и замены старого на новый
Кеш можно хранить:
- на том же сервере что и сайт - нет задержек в сети, но зато ресурсы теже, CPU, диск, оперативная память
- на внешнем сервере - задержки в сети, зато ресурсы отдельно
Можно совмещать разные виды кеширования для разных данных.
Можно кешировать только результат работы функций (вычисления, данные), а шаблоны не трогать,
можно вместе с шаблонами, но тогда каждое изменение шаблонов повлечёт сброс всего кеша где он участвует.
Если используете
CMS/CMF -
посмотрите готовые плагины для кеширования. Если у вас не sharing-хостинг с мини-сайтом - озаботтесь профилированием (xhproof) и мониторингом, это поможет понять где и что кешировать.
Так же стоит рассмотреть
кэширование байт-кода:
Стоит прочитать вот эту статью:
Сравнение скорости исполнения кода Drupal для PHP 5.3-5.6 и 7.0. «Битва оптимизаторов кода» apc vs xcache vs opcache https://habrahabr.ru/post/264775/
Так же стоит:
- увеличить буферы в MySQL (если памяти много)
- потюнить другие системы, например поставить nginx вместо apache, раздавать статику с другого хоста
- и конечно же - посмотреть как долго работают SQL запросы и по возможности их облегчить
Кеширование в MySQL с использованием
HandlerSocket:
- данные хранятся в MySQL innodb базе, а значит чтение и запись можно делать как по старинке через SQL так и через HandlerSocket
- можно сделать любое количество колонок, лишь бы это позволял MySQL
- быстрая вставка
- быстрая выборка
- бинарный протокол передачи данных
- есть несколько библиотек для PHP, как относительно новых так и старых
- в Percona Server (форк MySQL) HandlerSocket.so есть в поставке по умолчанию, разве что нужно включить
- в MySQL необходимо собрать HandlerSocket самостоятельно и включить в MySQL
Можно почитать вот тут:
- То, что вы хотели знать о HandlerSocket, но не смогли нагуглить, Сергей Аверин - https://www.youtube.com/watch?v=qHqdhJ9ziik
- Gentoo Overlay с HandlerSocket, давно не обновлял но вроде работает - https://github.com/mantyr/overlay-gentoo-flower
- HS кеш, тоже давно не обновлялся, но как пример сойдёт - https://github.com/mantyr/php-hscache
- PHP Extension для HandlerSocket, не содержит последних коммитов, но зато, наверное, единственое место где есть точное описание всех методов и входящих параметров, https://github.com/mantyr/php-ext-handlersocketi