PHP: полный мануал с примерами, функциями и ООП
Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Дерево руководства
Глава 223 · Диагностика production
Dynamic tracing PHP: DTrace, SystemTap и bpftrace без ложной магии
Полная официальная ветка dynamic tracing: назначение probes, проверка сборки, ограниченная агрегация и честные платформенные границы трёх инструментов.
Dynamic tracing отвечает на системный вопрос, а не заменяет логи
Dynamic tracing наблюдает работающий PHP-процесс снаружи через статические USDT/DTrace probes, встроенные в подходящую сборку. Это нужно, когда обычный лог отвечает «что записало приложение», а инженер ищет время запросов, частоту функций, компиляцию файлов или поток исключений на уровне runtime. Инструмент не включают вслепую: проверяют сборку, права, стоимость probes и политику персональных данных.
| Источник | Что даёт |
|---|---|
| Лог приложения | Выбранные разработчиком события и бизнес-контекст. |
| Profiler/APM | Call graph и метрики с агентом/расширением. |
| DTrace/SystemTap/bpftrace | Наблюдение probes работающего процесса без изменения бизнес-кода. |
| Debugger | Остановка и детальное состояние; обычно не production. |
- Сначала метрика подтверждает проблему
- Выбирается один probe и короткое окно
- Фильтр ограничивает PID/endpoint
- Результат агрегируется, а не печатает каждое событие
- Гипотеза подтверждается обычным профилированием или кодом
Сначала доказать, что probes есть в нужном PHP binary
PHP должен быть собран с DTrace static probes (обычно configure option --enable-dtrace на поддерживаемой системе). Наличие команды dtrace или bpftrace отдельно не доказывает наличие PHP probes. Проверка состоит из трёх частей: версия и путь binary, символы/probes конкретного процесса, разрешения пользователя. FPM master и worker имеют разные PID; фильтр выбирает worker, который реально исполняет запрос.
| Семейство probe | Смысл наблюдения |
|---|---|
| request-startup / request-shutdown | Граница запроса, path и длительность. |
| compile-file-entry / return | Компилируемые PHP-файлы и время компиляции. |
| execute-entry / return | Вход/выход исполняемого файла. |
| function-entry / return | Вызов функции/метода; высокая частота требует фильтра/aggregation. |
| exception-thrown / caught | Жизненный цикл исключения. |
| error | Runtime error с контекстом, доступным probe. |
DTrace: probe → predicate → aggregation → короткий отчёт
DTrace script обычно описывает probe, predicate и action. Для request latency сохраняют timestamp на startup, вычитают его на shutdown и агрегируют по script/request. Печатать каждый function-entry дорого и создаёт огромный поток; count(), sum(), quantize() или ограниченный stack полезнее.
<?php
declare(strict_types=1);
$lines = file(__DIR__ . '/trace.log', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines === false) { throw new RuntimeException('trace.log не прочитан'); }
$duration = [];
foreach ($lines as $line) {
[$event, $request, $micros] = explode('|', $line, 3);
if ($event === 'request-done' && ctype_digit($micros)) {
$duration[$request] = (int) $micros;
}
}
arsort($duration);
foreach ($duration as $request => $micros) {
echo $request, ': ', $micros, " us\n";
}
Ожидаемый результат
/checkout.php: 18000 us
/health.php: 120 us
PHP-пример действительно выполнен над приложенным trace fixture. Он проверяет обработчик отчёта; сам DTrace backend на Windows не симулируется и не объявляется проверенным.
#!/usr/sbin/dtrace -s
php*:::request-startup
{ started[pid] = timestamp; }
php*:::request-shutdown
/started[pid] != 0/
{
@latency_us[copyinstr(arg0)] = quantize((timestamp - started[pid]) / 1000);
started[pid] = 0;
}
Скрипт — platform fragment: provider pattern и значение arg0 нужно сверить через dtrace -l/-lv на целевой сборке. Он не выполнен локально, потому что текущая Windows-среда не предоставляет DTrace PHP probes.
SystemTap: Linux-мост к статическим probes PHP
SystemTap на Linux умеет обращаться к совместимым статическим markers/USDT probes. Сначала перечисляют доступные probes конкретного executable или process, затем запускают короткий script с PID filter. Для kernel/perf access обычно нужны пакеты debuginfo, подходящее ядро и разрешения; production-политика может полностью запрещать такой доступ.
# Сначала инвентаризация — точный provider/mark берём из вывода
stap -L 'process("/usr/bin/php").mark("*")'
# Эскиз: счётчик входов в функции одного процесса
global calls
probe process("/usr/bin/php").mark("function__entry") {
if (pid() == target()) calls++
}
probe end { printf("function entries: %d\n", calls) }
# Запуск с PID должен соответствовать версии SystemTap в вашей системе
stap trace.stp -x "$PHP_WORKER_PID"
Команды contextual: путь, mark name, target() и права проверяют на целевой Linux. Локальная Windows-проверка не могла подтвердить kernel/backend.
- Не трассируйте все функции без фильтра: объём может изменить исследуемую систему.
- Записывайте kernel, PHP binary hash/configure command и точный script рядом с результатом.
- Секреты/персональные данные в arguments редактируйте или вообще не собирайте.
bpftrace: короткое USDT-окно с заранее заданным вопросом
bpftrace использует USDT probes через синтаксис, доступный конкретной версии инструмента. Он удобен для компактных histogram/count scripts, но требует BTF/kernel support, прав и видимых probes в PHP binary. Начинайте с bpftrace -l; wildcard из лаборатории не является production-фильтром.
# Инвентаризация: provider и probe names должны реально появиться
bpftrace -l 'usdt:/usr/bin/php:*'
# Эскиз короткого счётчика request startup по PID
bpftrace -e '
usdt:/usr/bin/php:php*:request__startup
/pid == $1/
{ @requests = count(); }
interval:s:10 { print(@requests); clear(@requests); exit(); }
' "$PHP_WORKER_PID"
Это contextual command. На целевом Linux сначала проверяют фактическое имя probe и поддержку positional parameter; текущая Windows-среда его не выполняла.
| Отказ | Что проверить |
|---|---|
| Список USDT пуст | Другой binary, PHP без probes, stripped artifact или неподдерживаемый backend. |
| Permission denied | Capabilities/sudo policy, lockdown/SELinux и разрешения процесса; не обходить политику. |
| Событий нет | PID worker, фактический endpoint и provider/probe spelling. |
| Нагрузка выросла | Снизить частоту, убрать stacks/printf, агрегировать и сократить окно. |
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


