Задать вопрос
@Arris1

Возможно ли профилирование на PHP без xhprof и xdebug?

Есть ли в PHP альтернативные профилированию способы получить при выполнении страницы или скрипта все методы и функции, которые при этом выполняются?
Профилирование достаточно сложно настраивать, на windows в связке с опенсервером, например, так и не получилось.
Есть способ с функцией debug_backtrace(), но он работает в случае, если мы знаем последний метод в цепочке. Функция тогда выведет обратный стек вызовов.
Есть ли аналоги или альтернативы, если мы знаем только первый метод в цепочке выполнения?
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Средний 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
register_shutdown_function + register_tick_function + debug_backtrace

этот сниппет помещаем в начало скрипта или подключаем через инклуд
в результате после завершения работы скрипта, даже при exit; в текстовый файл пишется полный трейс вызовов
/tmp/execution_trace.json - поменять на своё

<?php
$execution_log = [];
$start_time = microtime(true);

function log_execution() {
    global $execution_log;
    static $last_call = null;
    
    $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
    if (count($trace) < 2) return;
    
    $current_call = $trace[1]['function'] ?? 'main';
    $file = $trace[1]['file'] ?? 'unknown';
    $line = $trace[1]['line'] ?? 'unknown';
    
    // Записываем только если вызов изменился
    if ($current_call !== $last_call) {
        $execution_log[] = [
            'call' => $current_call,
            'file' => $file,
            'line' => $line,
            'time' => microtime(true)
        ];
        $last_call = $current_call;
    }
}

// Запускаем отслеживание
declare(ticks=1);
register_tick_function('log_execution');

// Сохраняем при завершении
register_shutdown_function(function() {
    global $execution_log, $start_time;
    
    unregister_tick_function('log_execution');
    
    $result = [
        'total_calls' => count($execution_log),
        'execution_time' => microtime(true) - $start_time,
        'calls' => $execution_log
    ];
    
    file_put_contents('/tmp/execution_trace.json', json_encode($result, JSON_PRETTY_PRINT));
});

//дальше весь ваш код на PHP


p.s. xdebug настроить на windows или openserver не проблема. Можно задать новый вопрос, как настроить xdebug, я попробовал то то и то...
Ответ написан
@rPman
Настоятельно рекомендую решить проблему с запуском штатных инструментов, иначе будете решать не ту проблему и затратите сил больше чем имеет смысл.
p.s. например в windows уже давно есть wsl, wsl2 (или штатная виртуалка), запускаете полноценный linux и настраиваете там.

Когда то давно, когда я был 'маленьким и глупым', я профилировал код, написав скрипт, добавляющий в каждую мою функцию (поиском по файлам с регулярками, код уже тогда я писал стилистически однообразным) логирование в машиночитаемом виде, и после запуска программы другими самописными скриптиками читал эти логи.

Сейчас происходит почти все то же самое, просто кто то уже написал за вас все.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы