Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

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

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 223 · Диагностика production

Dynamic tracing PHP: DTrace, SystemTap и bpftrace без ложной магии

Полная официальная ветка dynamic tracing: назначение probes, проверка сборки, ограниченная агрегация и честные платформенные границы трёх инструментов.

Dynamic tracing отвечает на системный вопрос, а не заменяет логи

Dynamic tracing наблюдает работающий PHP-процесс снаружи через статические USDT/DTrace probes, встроенные в подходящую сборку. Это нужно, когда обычный лог отвечает «что записало приложение», а инженер ищет время запросов, частоту функций, компиляцию файлов или поток исключений на уровне runtime. Инструмент не включают вслепую: проверяют сборку, права, стоимость probes и политику персональных данных.

ИсточникЧто даёт
Лог приложенияВыбранные разработчиком события и бизнес-контекст.
Profiler/APMCall graph и метрики с агентом/расширением.
DTrace/SystemTap/bpftraceНаблюдение probes работающего процесса без изменения бизнес-кода.
DebuggerОстановка и детальное состояние; обычно не production.
Безопасный разбор задержки
  1. Сначала метрика подтверждает проблему
  2. Выбирается один probe и короткое окно
  3. Фильтр ограничивает PID/endpoint
  4. Результат агрегируется, а не печатает каждое событие
  5. Гипотеза подтверждается обычным профилированием или кодом

Сначала доказать, что 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Жизненный цикл исключения.
errorRuntime 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 не симулируется и не объявляется проверенным.

Контекстный DTrace-скрипт для распределения latencyФрагмент или команда
#!/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-политика может полностью запрещать такой доступ.

SystemTap: сначала список markers, потом фильтр PIDФрагмент или команда
# Сначала инвентаризация — точный 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-фильтром.

bpftrace: инвентаризация и ограниченное 10-секундное окноФрагмент или команда
# Инвентаризация: 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 deniedCapabilities/sudo policy, lockdown/SELinux и разрешения процесса; не обходить политику.
Событий нетPID worker, фактический endpoint и provider/probe spelling.
Нагрузка вырослаСнизить частоту, убрать stacks/printf, агрегировать и сократить окно.
Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.