Задать вопрос
Ответы пользователя по тегу Отладка
  • Возможно ли профилирование на PHP без xhprof и xdebug?

    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, я попробовал то то и то...
    Ответ написан
    1 комментарий