В настоящее время я создаю фреймворк PHP (оригинальный, я знаю), и я работаю над некоторыми функциями оптимизации для него. Одна дилемма, которую я пришла, – это лучший способ кэшировать результаты MySQL? Я знаю, что некоторые люди скажут: сначала оптимизируйте свой MySQL и т. Д., Но, скажем, ради аргументов, мой запрос занимает 1 минуту для запуска и максимально оптимизирован.
Каким будет лучший способ кэшировать результаты в PHP, поэтому мне не нужно повторно запускать запрос на каждую загрузку страницы?
Моя первая мысль состояла в том, чтобы, возможно, пропустить результаты, добавить их в массив … сериализовать их, а затем сохранить в файле. Теперь, когда создание кеша происходит только один раз, я могу позволить себе накладные расходы функции сериализации, если массив содержит 1 миллион результатов. Как бы то ни было, загрузка кэшированного файла, а затем нессериализация массива на каждой странице, может повлиять на производительность.
Будет ли тогда лучше кэшировать, а не сериализовать результаты и запись в файл, записать в файл таким образом, чтобы отображать результаты в читаемом для чтения массиве. Поэтому, когда он загружается, нет лишних излишних затрат.
Существуют ли другие (более быстрые) способы кэширования медленного запроса для частого использования?
Если это прямой массив, вы можете использовать var_export (), а не сериализовать (обернуть его соответствующим «" и записать его в .php-файл, а затем включить () в свой скрипт. Лучше всего сделать, если вы можете его написать за пределами дерева htdocs, и только действительно подходит для больших объемов данных, которые кэши памяти будут считать чрезмерными.
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, возвращает несертифицированное содержимое файла. В противном случае перезапишите его.
Mysql кэширует результат запроса, возможно, вам следует увеличить размер кеша запросов mysql? Или результат кэширования большого запроса в автономной таблице?
Google для Memcache, который должен поставить вас в правильном направлении.