Integrator Core (версия 56, дополнено в 72)
Единый слой между сервисом и сторонними API. Все запросы через Providers\Client::request() проходят Providers\Gateway.
Что делает
- Каталог (
Providers\Policy): 21 провайдер — хосты, единицы за вызов, срок кэша, общий ли кэш, правила хранения и атрибуции. - Предохранитель: 5 сбоев подряд (код 0 или ≥500) → пауза 5 мин × 2^(n−5), до 6 ч; 401/403 → пауза 1 ч («ключ не принят»); 429 → пауза по Retry-After (или 2 мин). Новый ключ в «Сторонних API» снимает паузу. Через паузу проходит одна пробная попытка.
- Кэш ответов (GET, и POST для Wordstat): ключ — пользователь, метод, URL, авторизация, тело; только 2xx до 400 КБ; общий кэш для публичных источников (Википедия). Ручные кнопки «Обновить» обходят кэш (
Gateway::$fresh). - Бюджет: месячный лимит единиц на (пользователь, сервис), цена за 1000 — вводится вручную, события при 80 % и исчерпании; после лимита вызовы блокируются до следующего месяца.
- Контракты (
bin/contracts.php, cron раз в сутки, или кнопка): лёгкий реальный вызов подключённых сервисов — ключ работает, ответ разбирается; при сбое — событиеprovider-down. - Страница
/api-health: состояние, расход, бюджеты, кэш, памятка по условиям провайдеров (ориентир, не юридическая консультация). - Соответствие (
Providers\Compliance,bin/compliance.php, cron раз в сутки): срок храненияkeepизPolicyприменяется принудительно (сейчас — тексты отзывов по API), реестр условий с отметкой «сверено», свежесть данных (Compliance::EVERY— норма обновления), бюджет ошибок за 30 суток (цель 95 %, ответы из кэша не считаются), событияprovider-slo/stale/terms. - Проверки добавлены для Places, 2ГИС, Yelp, PageSpeed и Safe Browsing (
Providers\Probe). - События
provider-down/auth/budgetпопадают в диспетчерскую (категория «Сторонние API»).
Как подключить новый провайдер
- Строка в
Policy::PROVIDERS(id, regex хоста, units, ttl). - Запросы — только через
Client. Синхронизатор начинается с$gw = Gateway::scope($store, $uid);. - Для проверки формата — запись в
Contracts::CHECKABLE. - Для свежести — период в
Compliance::EVERY; если данные нельзя показывать публично — ничего не нужно (по умолчанию нельзя), открытые источники — вCompliance::PUBLIC.
Ограничения
Форматы ответов живых API не проверялись на реальных ключах; контракты именно для этого. Цены и лимиты задаёт владелец.