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

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

Есть ли в PHP альтернативные профилированию способы получить при выполнении страницы или скрипта все методы и функции, которые при этом выполняются?
Профилирование достаточно сложно настраивать, на windows в связке с опенсервером, например, так и не получилось.
Есть способ с функцией debug_backtrace(), но он работает в случае, если мы знаем последний метод в цепочке. Функция тогда выведет обратный стек вызовов.
Есть ли аналоги или альтернативы, если мы знаем только первый метод в цепочке выполнения?
  • Вопрос задан
  • 178 просмотров
Подписаться 1 Средний 5 комментариев
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
@rPman
Настоятельно рекомендую решить проблему с запуском штатных инструментов, иначе будете решать не ту проблему и затратите сил больше чем имеет смысл.
p.s. например в windows уже давно есть wsl, wsl2 (или штатная виртуалка), запускаете полноценный linux и настраиваете там.

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

Сейчас происходит почти все то же самое, просто кто то уже написал за вас все.
Ответ написан
Комментировать
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, я попробовал то то и то...
Ответ написан
Ваш ответ на вопрос

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

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