Лекция 10 �Кеширование, API, почта
intervolga.ru/school/
Ерофеев Анатолий Андреевич
ИНТЕРВОЛГА
Руководитель отдела разработки
Устройство ИНТЕРНЕТА,
HTTP, HTML, верстка
Веб-сервер�Лекции 1 и 2�ЛР 1
Работа с данными�PHP, MySQL, веб-формы, фильтрация данных�Лекции 3 и 4�ЛР 2
Работа с формами, куками, сессиями.
Авторизация, регистрация, проверка доступа�Лекции 5 и 6�ЛР 3
Обработка текста на PHP.
Организация длительных операций и точек доступа для AJAX�Лекции 7 и 8�ЛР 4
Работа с файлами и сетью. Кеширование и внешние API.�Лекции 9 и 10�ЛР 5
ОС
СУБД
Программа
(сайт)
Браузер
Есть разные способы сделать сайт быстрее:
ОС
СУБД
Программа
(сайт)
Браузер
Что такое кеширование
Ключевая идея: возвращать ранее рассчитанный результат для указанных входных данных.
Ленивый кеш — самый частый способ реализации. Логика обработки запроса:
Кеш похож на словарь:
Таких словарей (кешей) в программе может быть несколько, а может быть один, принципиальной разницы нет.
У контроллера жесткого диска часто есть собственный небольшой кеш.
Он позволяет быстрее считывать данные, к которым чаще всего обращаются.
ОС
СУБД
Программа
(сайт)
Браузер
У контроллера жесткого диска часто есть собственный небольшой кеш.
Он позволяет быстрее считывать данные, к которым чаще всего обращаются.
При вызове fopen/fread/fseek и пр. операционная система не всегда обращается напрямую к диску.
ОС хранит части диска в оперативной памяти.
ОС
СУБД
Программа
(сайт)
Браузер
СУБД не всегда обращается к ОС для чтения своих файлов, потому что системные вызовы выполняются не быстро.
Части этих файлов хранятся в оперативной памяти.
В MySQL это называется buffer pool.
ОС
СУБД
Программа
(сайт)
Браузер
СУБД не всегда обращается к ОС для чтения своих файлов, потому что системные вызовы выполняются не быстро.
Части этих файлов хранятся в оперативной памяти.
В MySQL это называется buffer pool.
В СУБД может быть кеш запросов:
ключ — текст SQL-запроса�значение — результирующий набор (строки)
В MySQL 8+ эта функция удалена. Она делает производительность СУБД непредсказуемой.
ОС
СУБД
Программа
(сайт)
Браузер
Программа может кешировать некоторые SQL-запросы.
Программа может кешировать запросы к внешним сервисам.
ОС
СУБД
Программа
(сайт)
Браузер
Программа может кешировать некоторые SQL-запросы.
Программа может кешировать запросы к внешним сервисам.
Сайт может кешировать целые HTML-страницы или части страниц:
ОС
СУБД
Программа
(сайт)
Браузер
Браузер может кешировать HTTP-ответы сервера.
Чаще всего это используют для редко изменяющихся документов (CSS, JS, картинки…).
ОС
СУБД
Программа
(сайт)
Браузер
Инвалидация кеша
Инвалидация кеша: по времени
Инвалидация кеша: очистка при изменении
Инвалидация кеша: Least Recently Used (LRU)
Эффективность кеширования
Общую эффективность кеша считают соотношением:
Кол-во попаданий (cache hits)
Кол-во запросов
Для отдельных видов кеширования есть специальные метрики.
Очистка кеша при изменении данных приводит к уменьшению кол-ва попаданий и увеличению кол-ва промахов (cache misses).
Эффективность связана с соотношением числа запросов на чтение и на запись.
Кеширование может снизить скорость выполнения программы, если в БД чаще пишут, чем читают.
HTTP-кеширование
Особенности нагрузки на WEB-сайт
Интернет-магазин «хищник.рф»
≈ 100 тыс визитов/мес, ≈ 7 страниц/визит
Сайты выполняют большое число однотипных задач от большого числа пользователей:
Учетная система на базе «1С»
≈ 100 пользователей всего
Требуются примерно одинаковые серверы для обоих проектов.
Состав страницы сайта
На разных сайтах объем страницы сильно отличается.
Пример:
Состав страницы сайта
На разных сайтах объем страницы сильно отличается.
Пример:
Итого: сервер отдает 4.5 МБ в сжатом виде (gzip). Чтобы загрузить одну страницу, нужно около 100 HTTP-запросов.
Главная страница volsu.ru:�7.8 МБ, 150 запросов.
Браузер выполняет несколько запросов одновременно: обычно 6-8.
При повторном открытии той же страницы браузер загружает ≈ 50-100 КБ. Работает HTTP-кеширование.
Управление HTTP-кешированием
Браузер кеширует HTTP-ответы так, как ему скажет сервер.
Настройка кеширования выполняется с помощью заголовков в HTTP-ответе.
Программист должен добавить отправку нужных заголовков в код страницы.
Для статического контента (CSS, JS, изображения) настройка заголовков выполняется на уровне веб-сервера.
Заголовки:
Cache-Control
Date�Last-Modified�If-Modified-Since
ETag�If-None-Match
Cache-Control
Первый раз браузер делает запрос как обычно.
В заголовке Cache-Control указано:
GET /style.css HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2021 13:08:56 GMT
Cache-Control: max-age=604800, immutable
Content-Length: ...
...
Last-Modified, If-Modified-Since
Первый раз браузер делает запрос как обычно.
Cache-Control: no-cache означает, что браузер будет кешировать запрос, но перед использованием кеша должен спрашивать разрешение у сервера.
Браузер делает запрос с заголовком If-Modified-Since, который равен Date кешированного ответа.
Если сервер пришлет ответ 304 (без тела), то браузер может использовать ответ из своего кеша.
GET /style.css HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2021 13:08:56 GMT
Cache-Control: no-cache
Last-Modified: Mon, 08 Nov 2021 09:30:00 GMT
Content-Length: ...
...
GET /style.css HTTP/1.1
Host: example.com
If-Modified-Since: Tue, 09 Nov 2021 13:08:56 GMT
HTTP/1.1 304 Not Modified
Date: Wed, 10 Nov 2021 17:25:00 GMT
Last-Modified: Mon, 08 Nov 2021 09:30:00 GMT
ETag, If-None-Match
Первый раз браузер делает запрос как обычно.
Второй запрос браузер делает с заголовком If-None-Match, который равен ETag кешированного ответа.
Если сервер пришлет ответ 304 (без тела), то браузер может использовать ответ из своего кеша.
ETag — это обычно хеш запрашиваемого ресурса.
Если в запросе указан If-None-Match, то сервер игнорирует If-Modified-Since.
GET /style.css HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2021 13:08:56 GMT
Cache-Control: no-cache
ETag: "33a64df551425f"
Content-Length: ...
...
GET /style.css HTTP/1.1
Host: example.com
If-None-Match: "33a64df551425f"
HTTP/1.1 304 Not Modified
Date: Wed, 10 Nov 2021 17:25:00 GMT
ETag: "33a64df551425f"
Серверное кеширование
Что и когда кешировать
Самые распространенные случаи:
Пример кеширования на сервере
Есть функция, которая возвращает из БД график работы сотрудника на указанный месяц в году.
findWorkSchedule($userId, $monthYear)
Функция делает сложный SQL-запрос.
Способ реализации:
Пример кеширования на сервере
Есть функция, которая возвращает из БД график работы сотрудника на указанный месяц в году.
findWorkSchedule($userId, $monthYear)
Функция делает сложный SQL-запрос.
Способ реализации:
Если параметров много или они длинные, можно расчитать хеш, пример ключа:
workSchedule_<md5 от всех аргументов>
Способы хранения кеша в PHP
На локальном диске
Диск расположен на том же сервере, что и программа (сайт).
Обращения к диску будут самыми быстрыми по сравнению с другими популярными решениями.
Специальное ПО
На том же сервере, что и сайт, либо на отдельном сервере можно запустить:
Это сервисы ОС (запускаются при старте сервера и работают постоянно).
Являются хранилищами типа ключ–значение.
PHP взаимодействует с ними по сетевому протоколу.
Используйте готовые решения для кеширования
Использование внешних API
Примеры интеграции с внешними сервисами
С участием пользователя:
Без участия пользователя:
REST API (с точки зрения пользователя)
REST API — совокупность принципов построения программного интерфейса для разработчиков ПО поверх протокола HTTP.
Чаще всего похож на удаленный вызов процедур: HTTP-запрос запрос вызывает функцию во внешнем сервисе, ее возвращаемое значение приходит в HTTP-ответе.
Тело запроса и ответа, чаще всего — JSON.
Метод HTTP указывает что сделать с ресурсом: считать, добавить, обновить…
GET /products/15 HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: ...
{
"id": 15,
"name: "Ручка шариковая синяя",
"price": {
"amount": 25.0,
"currency": "RUB"
},
"inStock": true
}
Аутентификация в REST API
Оформление заказа, просмотр истории заказов, смена пароля и пр. — эти операции могут выполнить только авторизованные пользователи.
При вызове REST API часто нужно передавать ключ доступа (access token).
Способы получения ключа доступа:
GET /orders/15 HTTP/1.1
Authorization: Bearer d42a148795d9f25f89d4
...
GET /orders/15 HTTP/1.1
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
...
OAuth 2
Basic
Клиент API на языке программирования
Клиент — совокупность функций на конкретном языке программирования, которые позволяют вызывать REST API. В этих функциях написан код отправки HTTP-запроса и обработки ответа.
Для многих публичных API есть готовые клиенты. Используйте их.
Если не нашли — напишите свой.
Электронная почта
Структура электронного письма
Subject: How are you?
From: bob@example.com
To: alice@example.com
Cc: ...
Bcc: ...
Hi Alice,
What’s up?
Архитектура электронной почты
Яндекс.Почта
Mail.ru
Mail User Agent (MUA)
Прим.: Outlook
Mail User Agent (MUA)
Прим.: iOS Mail App
Mail Transfer Agent (MTA)
Прим.: Postfix, Dovecot
Mail Transfer Agent (MTA)
Прим.: Postfix, Dovecot
Mail Delivery Agent (MDA)
Прим.: Postfix, Dovecot
Mail Delivery Agent (MDA)
Прим.: Postfix, Dovecot
Архитектура электронной почты
Яндекс.Почта
Mail.ru
Mail User Agent (MUA)
Прим.: Outlook
Mail User Agent (MUA)
Прим.: iOS Mail App
Mail Transfer Agent (MTA)
Прим.: Postfix, Dovecot
Mail Transfer Agent (MUA)
Прим.: Postfix, Dovecot
Mail Delivery Agent (MDA)
Прим.: Postfix, Dovecot
Mail Delivery Agent (MDA)
Прим.: Postfix, Dovecot
SMTP
SMTP
IMAP
Архитектура электронной почты
Яндекс.Почта
Mail.ru
Mail User Agent (MUA)
Прим.: Outlook
Mail User Agent (MUA)
Прим.: iOS Mail App
Mail Transfer Agent (MTA)
Прим.: Postfix, Dovecot
Mail Transfer Agent (MUA)
Прим.: Postfix, Dovecot
Mail Delivery Agent (MDA)
Прим.: Postfix, Dovecot
Mail Delivery Agent (MDA)
Прим.: Postfix, Dovecot
SMTP
SMTP
IMAP
SMTP
IMAP
Отправка почты из командной строки
user@host:~$ sendmail bob@example.com
How are you?
^D
user@host:~$ msmtp bob@example.com
How are you?
^D
Отправка почты из PHP
sendmail_path = /usr/sbin/sendmail -t -i
<?php
mail('bob@example.com', 'Hi!', 'What’s up?');
php.ini
Отправка почты из PHP: PHPMailer
PHPMailer — библиотека для более удобной отправки почты.
Не использует sendmail, сама является SMTP-клиентом.
Можно установить через Composer.
Спам и почтовые атаки
Subject: Больше не надо учиться
From: teacher@example.com
To: st1@example.com
Cc: st2@example.com, st3@example.com
Ставлю всем 100 баллов автоматом,
больше не ходите на занятия!
Студент отправляет письмо:
Основные механизмы защиты почты
При отправке:
При получении:
Пример SPF и DKIM
A�IPv4-адрес соответствующий домену
AAAA�IPv6-адрес
MX�Адрес почтового сервера входящей почты
TXT�Запись «общего назначения»