Глоссарий
Словарь веб-разработчика
Визначення технічних термінів з PHP, DevOps, MySQL та AI — з прикладами коду та поясненнями простою мовою.
228
терминов
46
букв
S
Saga Pattern
Saga — паттерн управления распределёнными транзакциями без использования 2PC. Длинная бизнес-транзакция разбивается на последовательность локальных транзакций. Каждая локальная транзакция публикует событие или сообщение. При сбое — выполняются компенсирующие транзакции.
Два типа
Choreography — каждый сервис реагирует на события и публикует следующие. Нет центрального координатора. Просто, но сложно отследить поток
Orchestration — центральный Saga Orchestrator координирует сервисы, отправляя команды и обрабатывая результаты. Сложнее, но прозрачнее
Пример: оформление заказа
CreateOrder → ReserveInventory → ProcessPayment → ShipOrder
если ProcessPayment fails:
→ ReleaseInventory (компенсирующая)
→ CancelOrder (компенсирующая)
Сложности
Компенсирующие транзакции не всегда возможны (отправленное сообщение не отзовёшь). Saga даёт Eventual Consistency, а не ACID. Дебаг сложнее, чем обычная транзакция.
Security Headers
Security headers — HTTP-заголовки ответа, инструктирующие браузер применить дополнительные меры безопасности. Бесплатная защита одной строкой конфигурации сервера.
Важные заголовки
Strict-Transport-Security: max-age=31536000; includeSubDomains — всегда HTTPS, даже если пользователь ввёл http://
Content-Security-Policy — каким источникам доверять скрипты, стили, изображения. Защита от XSS
X-Frame-Options: DENY — запретить встраивание в iframe. Защита от clickjacking
X-Content-Type-Options: nosniff — браузер не угадывает тип содержимого
Referrer-Policy: strict-origin-when-cross-origin — контроль заголовка Referer
Permissions-Policy — ограничить доступ к API (камера, микрофон, геолокация)
Проверка
securityheaders.com — бесплатный сканер с оценкой A-F. Mozilla Observatory — дополнительный аудит.
Server-Sent Events (SSE)
SSE (Server-Sent Events) — стандартный браузерный API для получения потока обновлений от сервера через обычное HTTP-соединение. Однонаправленный: только сервер → клиент. Проще WebSocket там, где не нужна двунаправленная коммуникация.
Как это работает
Клиент открывает соединение через EventSource. Сервер отвечает с Content-Type: text/event-stream и держит соединение открытым, отправляя события в формате:
data: {"price": 42.5, "symbol": "BTC"}\n\n
Клиентский код
const es = new EventSource('/api/prices');
es.onmessage = (e) => {
const data = JSON.parse(e.data);
updatePrice(data.symbol, data.price);
};
es.onerror = () => es.close();
SSE vs WebSocket
SSE — проще, HTTP/2-friendly, автоматическое переподключение, только текст
WebSocket — двунаправленный, бинарные данные, сложнее
SSE идеален для live-дашбордов, стриминга уведомлений, цен, прогресса задач.
Serverless
Serverless — модель развёртывания, при которой вы пишете функцию (handler) и платите только за время её выполнения. Серверы существуют, но вы о них не думаете: провайдер масштабирует автоматически от нуля до миллиардов вызовов.Как это работаетВы загружаете код. При HTTP-запросе или событии (S3 upload, очередь) провайдер запускает контейнер с вашей функцией, выполняет её и останавливает. «Холодный старт» — первый вызов после простоя — может добавлять задержку (десятки мс — секунды).Когда подходитНеравномерная нагрузка: от нуля до пиковых значенийEvent-driven задачи: обработка файлов, вебхуки, тригеры от БДMVP и прототипы — не нужно настраивать серверыКогда не подходитДолгосрочные процессы (лимит выполнения 15 мин в AWS Lambda)Постоянная нагрузка — дороже традиционного сервераStateful-приложения с постоянными соединениями (WebSocket)
Service Mesh
Service Mesh — инфраструктурный слой, управляющий сетевой коммуникацией между микросервисами: трафик, безопасность (mTLS), наблюдаемость, circuit breaking — без изменений в коде приложения. Реализуется через sidecar proxy (обычно Envoy).
Что предоставляет
Traffic management — canary deployments, A/B тесты, retry, timeout, rate limiting между сервисами
Security — автоматический mTLS между всеми сервисами. Zero Trust на сетевом уровне
Observability — автоматические метрики latency, error rate, tracing между сервисами без кода
Circuit Breaking — защита от каскадных отказов на уровне прокси
Как это работает
Рядом с каждым Pod запускается sidecar-контейнер (Envoy). Весь входящий/исходящий трафик сервиса проходит через него. Control plane (Istiod) конфигурирует все прокси централизованно.
Популярные решения
Istio (самый популярный), Linkerd (проще), Consul Connect.
Service Worker
Service Worker — JavaScript-файл, выполняющийся в фоновом потоке браузера, независимо от страницы. Перехватывает сетевые запросы, кеширует ресурсы и позволяет приложению работать офлайн. Техническая основа PWA.
Как регистрируется
// Регистрация
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
// sw.js — файл Service Worker
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache =>
cache.addAll(['/index.html', '/app.css', '/app.js'])
)
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(cached =>
cached ?? fetch(event.request)
)
);
});
Стратегии кеширования
Cache First — кеш, если есть; сеть как fallback. Для статики
Network First — сеть, если недоступна — кеш. Для API
Stale While Revalidate — вернуть кеш, обновить в фоне
Ограничения
Только HTTPS. Нет прямого доступа к DOM. Собственный цикл жизни (install → activate → fetch).
Singleton
Singleton — паттерн проектирования, гарантирующий существование единственного экземпляра класса и предоставляющий глобальную точку доступа к нему. Классическое применение: класс конфигурации, логер, соединение с БД.Реализацияclass Config {
private static ?self $instance = null;
private function __construct() {}
public static function getInstance(): self {
self::$instance ??= new self();
return self::$instance;
}
}КритикаSingleton — один из наиболее критикуемых паттернов. Он вводит глобальное состояние, усложняет тестирование (трудно заменить на mock), нарушает Dependency Inversion. В современном коде заменяется регистрацией зависимости как singleton в IoC-контейнере.
SLI, SLO, SLA
Три концепта из практики SRE (Site Reliability Engineering) для измерения и согласования надёжности сервиса между командами и клиентами.
SLI — Service Level Indicator
Числовая метрика, описывающая состояние сервиса. Примеры: процент успешных запросов, latency p99, uptime. «Что измеряем»
SLO — Service Level Objective
Внутренняя цель для SLI. «Какую планку ставим себе». Пример: 99.9% запросов выполняются за < 500 мс. SLO строже SLA — «буфер» для команды.
SLA — Service Level Agreement
Юридический договор с клиентом. «Что обещаем вовне». Нарушение SLA — финансовые санкции. Поэтому SLA всегда мягче SLO.
Error Budget
SLO 99.9% = 0.1% допустимых ошибок в месяц ≈ 43 минуты downtime. Error budget показывает, сколько «баланса надёжности» осталось. Если бюджет исчерпан — останавливаем новые деплои.
Soft Delete
Soft Delete — паттерн «мягкого» удаления: запись не удаляется из БД физически, а помечается как удалённая через поле deleted_at (timestamp). Все запросы автоматически фильтруют «удалённые» записи.
Зачем
Восстановление случайно удалённых данных
Аудит и compliance: данные хранятся по законодательному требованию
Сохранение связей: если Order ссылается на удалённого User — запись остаётся
Реализация
-- Миграция: добавить поле
ALTER TABLE users ADD COLUMN deleted_at TIMESTAMP NULL DEFAULT NULL;
-- "Удаление"
UPDATE users SET deleted_at = NOW() WHERE id = 42;
-- Запросы игнорируют "удалённых"
SELECT * FROM users WHERE deleted_at IS NULL;
Недостатки
Таблица растёт и никогда не очищается — нужна архивация
Unique constraints: удалённый email может блокировать новый аккаунт
Более сложные JOIN-ы и запросы
SOLID
SOLID — пять принципов объектно-ориентированного дизайна, сформулированных Робертом Мартином. Вместе они описывают, как писать код, который легко читать, тестировать и изменять.Пять принциповS — Single Responsibility — класс должен иметь только одну причину для изменения. UserService не должен одновременно отправлять email и сохранять в БДO — Open/Closed — открыт для расширения, закрыт для модификации. Добавляйте новое поведение через новые классы, не изменяя старыеL — Liskov Substitution — дочерний класс должен быть заменителем родительского без изменения поведения программыI — Interface Segregation — лучше несколько узких интерфейсов, чем один широкий. Клиент не должен зависеть от методов, которые не используетD — Dependency Inversion — зависите от абстракций, а не от конкретных реализаций
SPA (Single Page Application)
SPA (Single Page Application) — приложение, где браузер загружает одну HTML-страницу, а все последующие переходы происходят без перезагрузки: JavaScript динамически обновляет DOM и получает данные через API.ПреимуществаПлавная навигация без «мигания» страницыЛогика UI в JavaScript — сервер возвращает только данные (JSON API)Можно преобразовать в PWA (Progressive Web App)НедостаткиSEO — поисковые боты плохо обходят JavaScript-контент. Решается через SSR или Static GenerationПервая загрузка — большой JS-бандл может долго парситься на слабых устройствахСложнее разработка — управление состоянием, роутинг, авторизация — всё на JSПопулярные фреймворкиReact, Vue, Angular, Svelte. Часто сочетаются с метафреймворками (Next.js, Nuxt, SvelteKit), добавляющими SSR и Static Generation.
Spread-оператор (...)
Spread-оператор (...) в PHP распаковывает массив или Traversable в список аргументов или элементов. Упрощает передачу переменного числа аргументов и слияние массивов.
Распаковка в аргументы
function sum(int ...$nums): int {
return array_sum($nums);
}
$numbers = [1, 2, 3];
echo sum(...$numbers); // 6
Variadic functions
function log(string $level, string ...$messages): void {
foreach ($messages as $msg) {
echo "[$level] $msg\n";
}
}
log('info', 'Started', 'Connected', 'Done');
Слияние массивов (PHP 8.1 — string keys)
$defaults = ['color' => 'blue', 'size' => 'M'];
$custom = ['color' => 'red'];
$result = [...$defaults, ...$custom];
// ['color' => 'red', 'size' => 'M']
SQL-инъекция
SQL-инъекция — атака, при которой злоумышленник вставляет произвольный SQL-код в запрос через входные данные. Если приложение подставляет их без экранирования, атакующий может читать любые данные, изменять или удалять их, а в некоторых СУБД — выполнять команды ОС.Классический примерЗапрос SELECT * FROM users WHERE email = '{$email}' с вводом ' OR 1=1 -- превращается в WHERE email = '' OR 1=1 --' — и возвращает всех пользователей.ЗащитаПараметризованные запросы / Prepared Statements — единственный надёжный способ. Данные и SQL-код всегда разделены на уровне протокола БДORM — большинство современных ORM используют prepared statements автоматическиWhitelist-валидация — проверять, что значение входит в разрешённый список, а не просто экранироватьНикогда не подставляйте данные пользователя напрямую в SQL-строку, даже после addslashes()
SSH
SSH (Secure Shell) — протокол для защищённого подключения к удалённому серверу по сети. Заменил небезопасный Telnet, где данные шли открытым текстом. Каждый разработчик, деплоящий на VPS или использующий Git-репозиторий, ежедневно пользуется SSH.АутентификацияПо паролю — удобно, но уязвимо к брутфорсу. Лучше отключитьПо ключу — пара приватного и публичного ключа. Приватный лежит у вас, публичный — на сервере в ~/.ssh/authorized_keys. Безопасно и удобноТипичные командыssh user@server.com # подключение
ssh-keygen -t ed25519 # генерация ключей
ssh-copy-id user@server.com # копирование публичного ключаSSH TunnelingSSH позволяет пробросить локальный порт через зашифрованный туннель: например, подключиться к БД на продакшн-сервере с ноутбука без открытия порта БД наружу.
SSR (Server-Side Rendering)
SSR (Server-Side Rendering) — генерация HTML на сервере при каждом запросе и отправка готовой разметки в браузер. Браузер получает полноценный HTML сразу, без ожидания JavaScript. Противоположность — CSR (Client-Side Rendering, то есть SPA).Преимущества SSRSEO — поисковые боты сразу видят весь контентПервая отрисовка — контент виден до того, как выполняется JSСлабые устройства — меньше работы для браузераНедостаткиКаждый запрос — работа сервера, что повышает нагрузкуМедленнее навигация (по сравнению со SPA) без streaming или partial renderingПодходыTraditional SSR — PHP, Ruby, Python рендерят HTML-шаблоны. Проверено годамиHydration — сервер рендерит HTML, клиент «оживляет» его JS-компонентами (Next.js, Nuxt)Static Generation (SSG) — HTML строится при деплое, а не при запросе. Максимально быстро
SSRF (Server-Side Request Forgery)
SSRF — атака, при которой злоумышленник заставляет сервер выполнить HTTP-запрос к произвольному адресу от своего имени. Сервер «проксирует» запрос — и атакующий получает доступ к ресурсам, недоступным снаружи: внутренние сервисы, metadata-сервис облака, локальная сеть.
Пример
Приложение загружает изображение по URL от пользователя: fetch_image?url=http://.... Злоумышленник передаёт url=http://169.254.169.254/latest/meta-data/ — AWS metadata endpoint. Сервер получает IAM-токены и возвращает их.
Защита
Whitelist разрешённых доменов — не доверяйте произвольным URL от пользователя
Блокировать запросы к приватным IP: 127.0.0.1, 10.x, 172.16-31.x, 192.168.x, 169.254.x
Проверять IP после DNS-резолюции — DNS rebinding обходит проверку хоста
IMDSv2 на AWS — токенизированный доступ к metadata
Strangler Fig Pattern
Strangler Fig — стратегия постепенной миграции монолитной системы на новую архитектуру. Новый код «обрастает» старый, как дерево-душитель обрастает хозяина — и постепенно заменяет его, не останавливая систему.
Как это происходит
Перед монолитом ставится прокси (API Gateway или Nginx)
Новые фичи реализуются в новых микросервисах
Части монолитного функционала постепенно переносятся в новые сервисы
Прокси переключает трафик с монолитного эндпоинта на новый
Когда весь функционал перенесён — моноліт выключается
Преимущества
Нулевой риск: в любой момент можно откатить на монолитный эндпоинт
Система работает всё время миграции
Постепенное накопление опыта команды с микросервисами
Альтернатива
Big Bang rewrite — переписать всё сразу. Статистически провальный подход для больших систем.
Strategy Pattern
Strategy — паттерн, выносящий изменяемое поведение в отдельный класс (стратегию) и позволяющий подменять его в runtime. Класс зависит от интерфейса стратегии, а не от конкретной реализации.Примерinterface SortStrategy {
sort(array $data): array;
}
class QuickSort implements SortStrategy { ... }
class MergeSort implements SortStrategy { ... }
class Sorter {
public function __construct(private SortStrategy $strategy) {}
public function sort(array $data): array {
return $this->strategy->sort($data);
}
}Когда применятьЕсть несколько вариантов одного алгоритма и нужно переключаться между нимиХотите избежать больших if/switch в коде, выбирающем алгоритмПоведение должно конфигурироваться снаружи или меняться в runtime