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, я попробовал то то и то...