Глосарій
Словник веб-розробника
Визначення технічних термінів з PHP, DevOps, MySQL та AI — з прикладами коду та поясненнями простою мовою.
228
термінів
47
літер
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, автоматичне перепідключення, text-only
WebSocket — двонаправлений, бінарні дані, складніший
SSE ідеальний для live-дашбордів, стрімінгу нотифікацій, цін, прогресу задач.
Serverless
Serverless — модель розгортання, де ви пишете функцію (handler) і платите лише за час її виконання. Сервери існують, але ви про них не думаєте: провайдер масштабує автоматично від нуля до мільярдів викликів.Як це працюєВи завантажуєте код. При HTTP-запиті або події (S3 upload, черга) провайдер запускає контейнер з вашою функцією, виконує її і зупиняє. «Холодний старт» — перший виклик після простою — може додавати затримку (десятки мс — секунди).Коли підходитьНерівномірне навантаження: від нуля до пікових значеньEvent-driven задачі: обробка файлів, вебхуки, тригери від БДMVP і prototypes — нема потреби налаштовувати сервериКоли не підходитьДовготривалі процеси (ліміт виконання 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. У сучасному коді замінюється реєстрацією через IoC-контейнер як singleton-залежність.
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