PHP Лучший способ кэшировать результаты MySQL?
В настоящее время я создаю фреймворк PHP (оригинальный, я знаю), и я работаю над некоторыми функциями оптимизации для него. Одна дилемма, которую я пришла, - это лучший способ кэшировать результаты MySQL? Я знаю, что некоторые люди скажут: сначала оптимизируйте свой MySQL и т.д., Но, скажем, ради аргументов, мой запрос занимает 1 минуту для запуска и максимально оптимизирован.
Каким будет наилучший способ кэширования результатов в PHP, поэтому мне не нужно повторно загружать запрос на каждую загрузку страницы?
Моя первая мысль состояла в том, чтобы, возможно, прокрутить результаты, добавить их в массив... сериализовать их, а затем сохранить в файле. Теперь, когда создание кеша происходит только один раз, я могу позволить себе накладные расходы функции сериализации, если массив содержит 1 миллион результатов. Как бы то ни было, загрузка кэшированного файла, а затем нессериализация массива на каждой странице, может повлиять на производительность.
Было бы лучше, если бы вместо кэширования вместо сериализации результатов и записи в файл, записывать в файл таким образом, чтобы отображать результаты в читаемом для чтения массиве. Поэтому, когда он загружается, нет лишних излишних издержек.
Есть ли какие-либо другие (более быстрые) способы кэширования медленного запроса для частого использования?
Ответы
Ответ 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, который должен поставить вас в правильном направлении.