Рубрики
Uncategorized

Системное объяснение – технология кэширования PHP

Автор оригинала: David Wong.

Резюме

Кэш стал неотъемлемой частью проекта, это лучший способ повысить производительность, например, уменьшить сетевой ввод-вывод, уменьшить дисковый ввод-вывод и т.д., Чтобы скорость загрузки проекта стала быстрее.

Кэш может быть кэшем ЦП , кэшем памяти и кэшем жесткого диска, и разные скорости запросов к кэшу различны (кэш ЦП > кэш памяти > кэш жесткого диска).

Далее я представлю их одного за другим.

Кэш браузера

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

Сильный кэш

Запрос, отправленный пользователем, напрямую получен из кэша клиента и не запрашивает сервер.

В соответствии с истекшими сроками действия и контролем кэша определите, следует ли использовать надежный кэш.

Код выглядит следующим образом:

header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT');
Header ("cache control: Max age = 3600"); // valid for 3600 seconds

Управление кэшем также может устанавливать следующие параметры:

  • Общедоступный: может быть кэширован всеми пользователями (браузер конечного пользователя/сервер CDN)
  • Личное: может быть кэшировано только браузером конечного пользователя
  • Нет кэша: не используйте локальный кэш
  • Нет хранилища: отключить кэширование данных

Кэш переговоров

Пользователь отправляет запрос на сервер, и сервер решает, использовать ли клиентский кэш.

Код выглядит следующим образом:

$last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
if (time() - $last_modify < 3600) {
    header('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT');
    header('HTTP/1.1 304'); //Not Modified
    exit;
}
header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');

Влияние поведения пользователя при работе с кэшем

Эффективный Эффективный Введите адресную строку
Эффективный Эффективный Пропуск страницы
Эффективный Эффективный Новое окно
Эффективный Эффективный Вперед / назад
недействительный Эффективный F5 обновить
недействительный недействительный CTRL + F5 обновить

Кэш файлов

Кэш файлов данных

Кэшируйте данные с низкой частотой обновления и высокой частотой чтения в файлы.

Например, несколько мест в проекте используют данные о городах для трехуровневой связи. Мы можем кэшировать данные о городе в файл (city_data. JSON). JS может считывать файл напрямую, не запрашивая внутренний сервер.

Размещение всей станции

CMS (система управления контентом), возможно, все с ней знакомы. Например, в ранних cms Dede и php статический HTML может быть установлен в фоновом режиме. Когда пользователи посещают веб-сайт, они читают статический HTML-код, не запрашивая внутреннюю базу данных или интерфейс данных ajax, что ускоряет скорость загрузки веб-сайта.

Статический HTML имеет следующие преимущества:

  • Хорошо для SEO
  • Быстрое открытие страницы
  • Уменьшите нагрузку на сервер

Кэш CDN

CDN (сеть доставки контента) сеть распространения контента.

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

Кэш в основном включает HTML, изображения, CSS, JS, XML и другие статические ресурсы.

Кэш NoSQL

Кэш Memcached

Memcached-это высокопроизводительный сервер кэширования распределенной памяти.

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

Он также может использоваться для хранения данных различных форматов, включая изображения, видео, файлы и т.д.

Memcached поддерживает только данные типа K/V и не поддерживает постоянное хранилище.

Разница между Memcache и memcached

  • Memcached начинается с 0.2.0, требуется версия PHP.2.0, а для Memcache требуется версия PHP.3.
  • Окончательное время выпуска memcached-24 декабря 2018 года, а окончательное время выпуска Memcache-7 апреля 2013 года.
  • Memcached основан на libmemcached, а Memcache основан на расширении PECL.

Вы можете рассматривать memcached как обновление Memcache.

Руководство пользователя PHP memcached:

Руководство пользователя PHP memcached:

Memcached часто сравнивают с redis. Далее мы представим кэш redis.

Кэш Redis

Redis-это высокопроизводительная база данных K/V.

Красный цвет в значительной степени компенсирует отсутствие кэшированного K/V хранилища, такого как список (связанный список), набор (набор), набор (упорядоченный набор), хэш (хэш). Он может не только хранить данные в памяти, но и сохранять их на диске, поддерживая синхронизацию “ведущий-ведомый”.

В целом, redis можно рассматривать как расширение memcached, которое является более тяжелым и мощным.

Redis в основном используется в повседневной работе.

Учебный веб-сайт Redis: Учебный веб-сайт Redis:

Кэш Mongodb

Mongodb-это база данных, основанная на распределенном файловом хранилище. Написано на C + +.

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

Mongodb-это продукт между реляционной базой данных и нереляционной базой данных. Он обладает самыми широкими функциями и больше всего похож на реляционную базу данных.

Учебный веб-сайт Mongodb: http://www.mongodb.org.cn

Кэш веб-сервера

Кэш Apache

используйте mod_expires , укажите время истечения срока действия кэша, который может кэшировать HTML, картинки, JS, CSS и т.д.

открывать |/httpd.conf , открыть модуль:

LoadModule expires_module modules/mod_expires.so

Укажите время истечения срока действия кэша:


     #Open cache
     ExpiresActive on 

     #CSS cache (8640000 seconds = 10 days)
     ExpiresByType text/css A8640000

     #js cache
     ExpiresByType application/x-javascript A8640000
     ExpiresByType application/javascript A8640000

     #html cache
     ExpiresByType text/html A8640000

     #Picture cache
     ExpiresByType image/jpeg A8640000
     ExpiresByType image/gif A8640000
     ExpiresByType image/png A8640000
     ExpiresByType image/x-icon A8640000

 

Кэш Nginx

использовать истекает срок действия Параметр для указания времени истечения срока действия кэша. HTML, картинки, JS, CSS и т.д. Могут быть кэшированы.

открыть nginx.conf :

//Take the picture as an example:
Location ~ \ (gif|jpg|jepg|png|bmp|ico) ${add a new location
    root html;
    Expires 1D; specifies the cache time
}

Вы также можете понять следующее: путь к кэшу прокси-сервера и кэш прокси-сервера для установки кэша.

Кэш кода операции

Код операции (код операции) код операции.

После запуска PHP-программы вся память будет немедленно освобождена. Все переменные в программе будут уничтожены. Каждый запрос будет переведен и выполнен, что приведет к снижению скорости.

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

Цель кода операции-избежать повторной компиляции и снизить нагрузку на процессор и память.

Кэш APC

APC (альтернативный кэш PHP) дополнительный кэш PHP.

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

APC может сократить время динамического анализа и компиляции PHP, чтобы PHP-скрипты могли выполняться быстрее.

Окончательное время выпуска расширения APC-2012-09-03.

Если вам интересно, вы можете узнать об этом. Официальное введение: http://php.net/manual/zh/book…

ускоритель

eAccelerator:Кэш кода операции PHP.

Если вам интересно, вы можете узнать об этом. Официальное введение: http://eaccelerator.net/

XCache

Xcache-это быстрый и стабильный буфер PHP-кода.

Вы можете узнать об этом, если вам интересно. Официальное введение: http://xcache.lighttpd.net/

Резюме

В этой статье в основном рассматриваются кэш браузера, кэш файлов, кэш NoSQL, кэш веб-сервера, кэш кода операции.

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

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

Какие еще кэши можно использовать, чтобы помочь нашему проекту?

Часто задаваемые вопросы о кэшировании

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

Вот несколько вопросов к вам. Это просто отвлекающий маневр.

Когда в проектах используется кэширование, мы выбираем redis или memcached. Почему?

Некоторые сценарии:

1. Например, чтобы реализовать простую функцию сбора журналов или отправить большое количество SMS-сообщений и функций электронной почты, метод реализации заключается в том, чтобы сначала собрать данные в очередь, а затем выполнить запланированную задачу для использования очереди и решения задач, которые необходимо выполнить.

Используйте redis lpush, r pop или r push, pop напрямую.

// queue
$redis->lpush(key, value);

// outgoing queue
$redis->rpop(key);

Memcached не имеет такой структуры данных.

Например, нам нужно хранить информацию о пользователе, идентификатор, имя, телефон, возраст, рост, как хранить?

Схема 1: ключ = > значение

Ключ? Данные? Идентификатор пользователя

Значение (пользовательские данные)

При запросе сначала извлеките ключ, а затем проанализируйте его с помощью JSON \

Схема 2: хэш

Ключ? Данные? Идентификатор пользователя

Хэш-ключ,

Хэш-ключ,

Хэш-ключ,

Хэш-ключ,

При запросе просто достаньте ключ.

// add
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);

// Editor
$redis->hSet(key, hashKey, value);

// query
$redis->hGetAll(key); // query所有属性
$redis->hGet(key, hashKey); // query某个属性

Схема 2 лучше, чем схема 1.

3. Например, социальные проекты похожи на Sina Weibo, список фокусов персонального центра и список поклонников, двусторонний список фокусов, популярный Weibo и подписку на новости.

Можно использовать приведенную выше структуру данных, предоставленную redis.

4. Memcached хранится только в памяти, в то время как redis может храниться в памяти или сохраняться на диске.

Если данные в требовании необходимо сохранить, пожалуйста, выберите redis.

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

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

Как обеспечить согласованность данных между кэшем и базой данных?

Новые данные: сначала добавьте в базу данных, затем добавьте в кэш.

Редактирование данных: удалите кэшированные данные, измените данные в базе данных, а затем добавьте их в кэш.

Удаление данных: сначала удалите кэшированные данные, а затем удалите данные в базе данных.

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

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

Проанализируйте конкретные проблемы.

А как насчет проникновения в кэш?

Пользователь запрашивает данные, которых нет в кэше, в результате чего запрос попадает непосредственно в базу данных.

1. Установите обычное значение ключа и сначала проверьте, соответствует ли ключ спецификации.

II. Ограничение тока интерфейса, деградация и слияние, пожалуйста, изучите историю: https://istio.io/

III. фильтр блума.

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

А как насчет лавин?

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

2. Стратегия двойного кэша: исходный кэш и кэш копирования. Когда исходному кэшу не удается запросить кэш копирования, время сбоя исходного кэша устанавливается на короткий срок, а кэш копирования устанавливается на длительный срок.

Уже сейчас это чистое метание и превращение нефрита. В сочетании с вашей собственной ситуацией, конкретными проблемами, конкретным анализом.

Рекомендуемое чтение

  • Объяснение системы Единый вход единого входа
  • Системное объяснение – Защита веб-безопасности PHP
  • Системное объяснение – проверка подписи интерфейса PHP
  • Системное объяснение – высокоточная работа PHP с плавающей запятой

Добро пожаловать в эту статью, пожалуйста, укажите автора и источник, спасибо!

Оригинал: “https://developpaper.com/system-explanation-php-caching-technology/”