Две техники кэширования PHP - PullRequest
0 голосов
/ 26 февраля 2019

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

Что касается общей производительности, вы бы предпочли

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

Оба метода будут кэшировать его только для текущего запроса.Вывод базы данных хранится только в переменной PHP.Так что никаких дальнейших методов кэширования, таких как Key-Value-Store или около того.

Первый метод будет кэшировать только выбранные элементы.Каждый вызов getItemByHandle(...) с другим дескриптором вызовет новое попадание в базу данных.

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

Я спрашиваю, потому что, возможно, естьтакже другие аспекты для рассмотрения, которые здесь не описаны.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Обычно PHP-скрипты запускаются заново с каждым вызовом.Это связано с тем, что HTTP по своей сути "не имеет состояния".Это означает, что кэширование между страницами невозможно.

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

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

Если ваш набор данных достаточно мал для кеширования всего, то запросы (без кеширования), вероятно, достаточно быстрые, чтобы у вас возникли проблемы с измерением разницы в скорости.

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

0 голосов
/ 26 февраля 2019

Меньше запросов к базе данных, тем лучше.

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

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

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