Подтвердить что ты не робот

PHP Лучший способ кэшировать результаты MySQL?

В настоящее время я создаю фреймворк PHP (оригинальный, я знаю), и я работаю над некоторыми функциями оптимизации для него. Одна дилемма, которую я пришла, - это лучший способ кэшировать результаты MySQL? Я знаю, что некоторые люди скажут: сначала оптимизируйте свой MySQL и т.д., Но, скажем, ради аргументов, мой запрос занимает 1 минуту для запуска и максимально оптимизирован.

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

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

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

Есть ли какие-либо другие (более быстрые) способы кэширования медленного запроса для частого использования?

4b9b3361

Ответ 1

Если это прямой массив, вы можете использовать var_export(), а не сериализовать (обернуть его соответствующим "" и записать его в .php файл, затем include(), что в вашем script. Лучше всего сделать, если вы можете записать его за пределами дерева htdocs и только реально подходит для больших объемов данных, которые кэшируются в памяти будет считать чрезмерным.

Ответ 2

Memcached.

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

// serialize an array of all results
$serialzedData = serialize($resultData);

// set TTL (60 seconds) and create cache filename with timestamp
$ttl = 60;
$cacheFilename = $ttl . '_' . time() . '_' . md5($sqlQuery)

// dump
file_put_contents($cacheFilename, $serializedData);

Перед запуском запроса он будет искать каталог cache для файлов с соответствующим хешем запроса. Если это так, он проверяет timestamp + ttl <= current_time, и если true, возвращает содержимое несериализованного файла. В противном случае перезапишите его.

Ответ 3

Mysql кэширует результат запроса, возможно, вам следует увеличить размер кеша запросов mysql? Или результат кэширования большого запроса в отдельной таблице?

Ответ 4

Google для Memcache, который должен поставить вас в правильном направлении.