Глоссарий
Словарь веб-разработчика
Визначення технічних термінів з PHP, DevOps, MySQL та AI — з прикладами коду та поясненнями простою мовою.
228
терминов
46
букв
D
DDoS атака
DDoS (Distributed Denial of Service) — атака, посылающая настолько большой объём трафика из множества источников (ботнет), что сервер не может обрабатывать легитимные запросы и становится недоступным.
Уровни атак
L3/L4 (сетевой/транспортный) — флуд UDP/TCP пакетами. Цель: насыщение канала. Защита: фильтрация на уровне провайдера
L7 (прикладной) — HTTP-флуд: тысячи запросов к тяжёлым endpoint-ам. Сложнее обнаружить, так как похоже на легитимный трафик
Защита
CDN с DDoS-защитой — Cloudflare, AWS Shield поглощают атаку на edge-узлах
Rate Limiting — ограничить количество запросов с IP
CAPTCHA — для подозрительных сессий
Geo-blocking — заблокировать регионы с аномальным трафиком
Anycast — распределение трафика между датацентрами
Decorator Pattern
Decorator — паттерн, динамически добавляющий новый функционал объекту без изменения его класса. Оборачивает оригинальный объект и расширяет или изменяет его поведение, реализуя тот же интерфейс.Примерinterface Logger { log(string $msg): void; }
class FileLogger implements Logger { ... }
class TimestampLogger implements Logger {
public function __construct(private Logger $inner) {}
public function log(string $msg): void {
$this->inner->log(date('H:i:s') . ' ' . $msg);
}
}Преимущества перед наследованиемДекораторы комбинируются динамически: new JsonLogger(new TimestampLogger(new FileLogger())). Наследование потребовало бы N² подклассов для каждой комбинации. Декораторы избегают нарушения Open/Closed, типичного при наследовании.
Dependency Injection
Dependency Injection (DI) — паттерн, при котором объект получает свои зависимости извне, а не создаёт их сам. Вместо new Mailer() внутри класса — Mailer $mailer в конструкторе. Класс лишь объявляет, что ему нужно.Почему это важноКласс, который сам создаёт зависимости, жёстко привязан к их конкретным реализациям. DI позволяет подменять реализации — например, в тестах заменить реальный почтовый клиент на фейковый — без изменений в коде класса.IoC-контейнерБольшинство фреймворков имеют встроенный контейнер, который автоматически резолвит зависимости: читает конструктор класса, находит зарегистрированные реализации интерфейсов и передаёт их. Вы описываете «что нужно» — контейнер решает «где это взять».Три способа инъекцииConstructor injection — наиболее распространён, зависимости обязательныSetter injection — зависимость опциональна, передаётся через методInterface injection — класс реализует интерфейс, через который получает зависимость
DNS
DNS (Domain Name System) — «телефонная книга» интернета: преобразует доменные имена (example.com) в IP-адреса. Браузер не знает, где физически находится сайт — DNS указывает адрес.Типы записейA — домен → IPv4 (93.184.216.34)AAAA — домен → IPv6CNAME — псевдоним; один домен → другой доменMX — почтовые серверы для доменаTXT — произвольный текст: SPF, DKIM, подтверждение владенияКак происходит разрешениеБраузер запрашивает локальный DNS-резолвер → рекурсивный резолвер провайдера → корневой сервер → TLD-сервер (.com) → авторитетный сервер домена → IP-адрес. Весь путь занимает десятки миллисекунд и кешируется на TTL.TTLTime To Live — время кеширования записи. Перед изменением A-записи уменьшите TTL до 300 секунд, сделайте изменения, затем верните назад. Это минимизирует время сбоя при переезде.
Docker
Docker — платформа контейнеризации, которая упаковывает приложение вместе со всеми зависимостями в изолированный контейнер. Контейнер одинаково работает на ноутбуке разработчика, CI-сервере и продакшне — устраняя классическое «у меня же работает».Контейнер vs Виртуальная машинаVM эмулирует полноценное железо с отдельным ядром ОС — тяжело и медленно стартует. Контейнер использует ядро хоста, изолируя только процессы и файловую систему. Запуск контейнера — секунды, а не минуты.Ключевые концепцииImage — неизменяемый снимок файловой системы, собранный из DockerfileContainer — запущенный экземпляр imageDockerfile — инструкция для сборки: базовый образ, копирование файлов, командыDocker Compose — запуск нескольких контейнеров (app + db + redis) одной командойVolume — постоянное хранилище данных вне контейнера
Docker Compose
Docker Compose — инструмент для запуска многоконтейнерных приложений через один YAML-файл (compose.yaml). Одной командой поднимает весь стек: приложение, БД, Redis, очередь — каждый в своём контейнере с правильными связями.
Базовая структура
services:
app:
build: .
ports: ["8080:80"]
depends_on: [db, redis]
environment:
DB_HOST: db
db:
image: mysql:8.4
volumes: [db-data:/var/lib/mysql]
environment:
MYSQL_ROOT_PASSWORD: secret
redis:
image: redis:alpine
volumes:
db-data:
Ключевые команды
docker compose up -d — запустить в фоне
docker compose down — остановить и удалить контейнеры
docker compose logs -f app — следить за логами
docker compose exec app bash — зайти в контейнер
DOM (Document Object Model)
DOM — объектное представление HTML-документа в виде дерева узлов. Браузер строит DOM из HTML и предоставляет JavaScript API для чтения и изменения структуры, стилей и контента страницы.Дерево узловhtml
├── head
│ └── title
└── body
├── h1
└── pОсновные операции// Найти элемент
const el = document.querySelector('.card');
// Изменить контент
el.textContent = 'Hello';
// Добавить класс
el.classList.add('active');
// Обработчик события
el.addEventListener('click', () => console.log('clicked'));
// Создать элемент
const btn = document.createElement('button');
document.body.appendChild(btn);Virtual DOMReact и другие фреймворки строят Virtual DOM — лёгкую копию DOM в памяти. При изменениях сравнивают новое и старое дерево (diffing) и обновляют только изменившиеся узлы. Это быстрее прямой манипуляции DOM.
Domain Events (Доменные события)
Domain Event — факт, произошедший в бизнес-домене: OrderPlaced, PaymentFailed, UserRegistered. Называется в прошедшем времени, так как описывает то, что уже произошло. Центральный концепт DDD и Event-Driven Architecture.
Чем отличается от обычного события
Техническое событие: ButtonClicked, FileUploaded. Доменное событие: InvoiceApproved, SubscriptionExpired — несёт бизнес-значение и является частью ubiquitous language.
Зачем использовать
Разъединить агрегаты — Order не знает о Notification
Аудит и Event Sourcing — полная история изменений домена
Асинхронная обработка побочных эффектов
Пример
class OrderPlaced {
public function __construct(
public readonly string $orderId,
public readonly string $userId,
public readonly Money $total,
public readonly \DateTimeImmutable $occurredAt,
) {}
}
// После успешного сохранения:
EventDispatcher::dispatch(new OrderPlaced($order->id, ...));
Domain-Driven Design (DDD)
DDD (Domain-Driven Design) — подход к разработке ПО, где центром является доменная модель: язык, концепты и правила бизнеса. Разработчики и доменные эксперты используют один язык (Ubiquitous Language). Код отражает реальный бизнес, а не структуру БД.Ключевые концепцииEntity — объект с уникальной идентичностью (User, Order)Value Object — объект без идентичности; равенство по значению (Money, Email)Aggregate — кластер объектов с одним корнем (Order + OrderItems)Repository — абстракция хранения агрегатовDomain Event — событие, произошедшее в домене (OrderPlaced)Bounded Context — граница, в которой модель и язык имеют однозначный смыслКогда оправданDDD добавляет сложность. Оправдан для сложных доменов с богатой бизнес-логикой. Для простых CRUD-приложений — избыточен.
DRY, KISS, YAGNI
Три принципа простого и поддерживаемого кода, которые часто нарушаются вместе и исправляются вместе.DRY — Don't Repeat YourselfКаждая единица знания должна иметь единственное, однозначное представление в системе. Дублирование кода означает, что изменение нужно вносить в нескольких местах — и одно неизбежно забудут. DRY — о знаниях, а не только о тексте: copy-paste плохо, но общая функция для двух разных концепций — тоже плохо.KISS — Keep It Simple, StupidПростейшее решение, которое решает задачу — лучшее. Сложный код трудно читать, тестировать и поддерживать. Сложность — враг.YAGNI — You Aren't Gonna Need ItНе реализуй функциональность, пока она действительно не нужна. Код, написанный «про запас», устаревает, захламляет кодовую базу и часто вообще не используется. Пишите для сегодняшних требований.
DTO (Data Transfer Object)
DTO (Data Transfer Object) — простой объект без логики, предназначенный исключительно для передачи данных между слоями приложения или между сервисами. Похож на структуру данных: только поля, никакого поведения.Зачем нуженИзолирует внутреннюю модель от внешнего API — изменение структуры БД не сломает ответ APIЯвно документирует, какие данные передаются между слоямиУдобен для валидации входных данных (Request DTO) и формирования ответов (Response DTO)Примерclass CreateUserDTO {
public function __construct(
public readonly string $name,
public readonly string $email,
public readonly string $password,
) {}
}DTO vs Entity vs ViewModelEntity — объект доменной модели с идентичностью (есть в БД)DTO — контейнер для передачи без идентичностиViewModel — DTO специально для отображения в UI/шаблоне