Php method call stack

Печать PHP Call Stack

Бонусные точки, если функция сбрасывает буфер ввода-вывода.

Если вы хотите создать обратную трассировку, вы ищете debug_backtrace и / или debug_print_backtrace .

Первый, например, даст вам массив, подобный этому (цитируя руководство) :

array(2) < [0]=>array(4) < ["file"] =>string(10) "/tmp/a.php" ["line"] => int(10) ["function"] => string(6) "a_test" ["args"]=> array(1) < [0] =>&string(6) "friend" > > [1]=> array(4) < ["file"] =>string(10) "/tmp/b.php" ["line"] => int(2) ["args"] => array(1) < [0] =>string(10) "/tmp/a.php" > ["function"] => string(12) "include_once" > > 

Они, по-видимому, не будут ob_flush буфер ввода-вывода, но вы можете сделать это самостоятельно, с ob_flush и / или ob_flush .

(см. страницу руководства первой, чтобы узнать, почему «и / или» ;-))

Более читаемый, чем debug_backtrace() :

$e = new \Exception; var_dump($e->getTraceAsString()); #2 /usr/share/php/PHPUnit/Framework/TestCase.php(626): SeriesHelperTest->setUp() #3 /usr/share/php/PHPUnit/Framework/TestResult.php(666): PHPUnit_Framework_TestCase->runBare() #4 /usr/share/php/PHPUnit/Framework/TestCase.php(576): PHPUnit_Framework_TestResult->run(Object(SeriesHelperTest)) #5 /usr/share/php/PHPUnit/Framework/TestSuite.php(757): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult)) #6 /usr/share/php/PHPUnit/Framework/TestSuite.php(733): PHPUnit_Framework_TestSuite->runTest(Object(SeriesHelperTest), Object(PHPUnit_Framework_TestResult)) #7 /usr/share/php/PHPUnit/TextUI/TestRunner.php(305): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false) #8 /usr/share/php/PHPUnit/TextUI/Command.php(188): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array) #9 /usr/share/php/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true) #10 /usr/bin/phpunit(53): PHPUnit_TextUI_Command::main() #11 " 

Чтобы зарегистрировать трассировку

$e = new Exception; error_log(var_export($e->getTraceAsString(), true)); 

Backtrace сбрасывает много мусора, который вам не нужен. Это очень долго, трудно читать. Все, что вы когда-либо хотели, – это то, что называется, откуда? Вот простое решение статической функции. Обычно я помещаю его в класс под названием «debug», который содержит все мои функции утилиты отладки.

Вы называете это следующим образом:

debugUtils::callStack(debug_backtrace()); 

И он производит вывод следующим образом:

================================================== 1. DatabaseDriver.php::getSequenceTable(169) 2. ClassMetadataFactory.php::loadMetadataForClass(284) 3. ClassMetadataFactory.php::loadMetadata(177) 4. ClassMetadataFactory.php::getMetadataFor(124) 5. Import.php::getAllMetadata(188) 6. Command.php::execute(187) 7. Application.php::run(194) 8. Application.php::doRun(118) 9. doctrine.php::run(99) 10. doctrine::include(4) ================================================== 

Странно, что никто не отправил этот путь:

debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); 

Это фактически выводит обратную трассировку без мусора – именно так называется метод и где.

Если вам нужна трассировка стека, которая очень похожа на то, как php форматирует трассировку стека исключений, чем использовать эту функцию, я писал:

function debug_backtrace_string() < $stack = ''; $i = 1; $trace = debug_backtrace(); unset($trace[0]); //Remove call to this function from stack trace foreach($trace as $node) < $stack .= "#$i ".$node['file'] ."(" .$node['line']."): "; if(isset($node['class'])) < $stack .= $node['class'] . "->"; > $stack .= $node['function'] . "()" . PHP_EOL; $i++; > return $stack; > с function debug_backtrace_string() < $stack = ''; $i = 1; $trace = debug_backtrace(); unset($trace[0]); //Remove call to this function from stack trace foreach($trace as $node) < $stack .= "#$i ".$node['file'] ."(" .$node['line']."): "; if(isset($node['class'])) < $stack .= $node['class'] . "->"; > $stack .= $node['function'] . "()" . PHP_EOL; $i++; > return $stack; > 

Это вернет трассировку стека следующим образом:

#1 C:\Inetpub\sitename.com\modules\sponsors\class.php(306): filePathCombine() #2 C:\Inetpub\sitename.com\modules\sponsors\class.php(294): Process->_deleteImageFile() #3 C:\Inetpub\sitename.com\VPanel\modules\sponsors\class.php(70): Process->_deleteImage() #4 C:\Inetpub\sitename.com\modules\sponsors\process.php(24): Process->_delete() 

См. debug_print_backtrace . Я думаю, вы можете позвонить по flush позже, если хотите.

Читайте также:  Javascript событие загрузки всей страницы

Это делает то, что вы хотите?

Используйте debug_backtrace чтобы получить обратную debug_backtrace о том, какие функции и методы были вызваны, и какие файлы были включены, что привело к тому, что debug_backtrace .

phptrace – отличный инструмент для печати стека PHP в любое время, когда вы хотите, без установки каких-либо расширений.

Существуют две основные функции phptrace: во-первых, стек вызовов печати PHP, который не нуждается в установке, во-вторых, трассирует потоки выполнения php, которые необходимо установить для расширения.

$ ./phptrace -p 3130 -s # phptrace -p -s phptrace 0.2.0 release candidate, published by infra webcore team process script_filename = /home/xxx/opt/nginx/webapp/block.php [0x7f27b9a99dc8] sleep /home/xxx/opt/nginx/webapp/block.php:6 [0x7f27b9a99d08] say /home/xxx/opt/nginx/webapp/block.php:3 [0x7f27b9a99c50] run /home/xxx/opt/nginx/webapp/block.php:10 

Возможно, вы захотите изучить debug_backtrace или, возможно, debug_print_backtrace .

пожалуйста, взгляните на этот класс utils, может быть полезно:

Решение Walltearer превосходно, особенно если оно включено в тег ‘pre’:

– который устанавливает вызовы на отдельные строки, аккуратно пронумерованные

Источник

debug_backtrace

debug_backtrace() выводит стек вызовов функций PHP в массив.

Список параметров

В версии 5.3.6, этот аргумент является битовой маской для следующих настроек:

Настройки debug_backtrace()
DEBUG_BACKTRACE_PROVIDE_OBJECT Требуется или нет заполнять данные «объектов».
DEBUG_BACKTRACE_IGNORE_ARGS Требуется или нет не выводить данные с индексом «args», то есть списки аргументов всех функций/методов, для уменьшения расхода памяти.

До версии 5.3.6 принимаются только значения TRUE или FALSE , которые означают, задана настройка DEBUG_BACKTRACE_PROVIDE_OBJECT или нет соответственно.

В версии 5.4.0, этот аргумент используется для ограничения количества вызовов функций, которые будут выведены. По умолчанию ( limit =0) будет выведен весь стек вызовов.

Возвращаемые значения

Возвращает массив вложенных ассоциативных массивов ( array ). Описание элементов массива приведено ниже:

Список возможных значений элементов массивов, возвращаемых функцией debug_backtrace()

Имя Тип Описание
function string Имя текущей функции. См. также __FUNCTION__.
line integer Текущий номер строки. См. также __LINE__.
file string Имя текущего файла. См. также __FILE__.
class string Имя текущего класса. См. также __CLASS__
object object Текущий объект.
type string Текущий тип вызова функции. Если это вызов метода объекта, будет выведено «->». Если это вызов статического метода класса, то «::». Если это простой вызов функции, не выводится ничего.
args array При нахождении внутри функции, будет выведен список аргументов этой функции. Если внутри включаемого файла, будет выведен список включаемых файлов.
Читайте также:  Python dict get function

Список изменений

Версия Описание
5.4.0 Добавлен необязательный аргумент limit .
5.3.6 Аргумент provide_object заменен на options и добавлена дополнительная настройка DEBUG_BACKTRACE_IGNORE_ARGS .
5.2.5 Добавлен необязательный аргумент provide_object .
5.1.1 Элементом возвращаемого массива теперь может быть текущий объект object .

Примеры

Пример #1 Пример использования debug_backtrace()

function a_test ( $str )
echo «\nHi: $str » ;
var_dump ( debug_backtrace ());
>

a_test ( ‘friend’ );
?>

// filename: /tmp/b.php
include_once ‘/tmp/a.php’ ;
?>

Результат аналогичен приведенному ниже, если запустить /tmp/b.php :

Hi: friend array(2) < [0]=>array(4) < ["file"] =>string(10) "/tmp/a.php" ["line"] => int(10) ["function"] => string(6) "a_test" ["args"]=> array(1) < [0] =>&string(6) "friend" > > [1]=> array(4) < ["file"] =>string(10) "/tmp/b.php" ["line"] => int(2) ["args"] => array(1) < [0] =>string(10) "/tmp/a.php" > ["function"] => string(12) "include_once" > >

Смотрите также

  • trigger_error() — Вызывает пользовательскую ошибку/предупреждение/уведомление
  • debug_print_backtrace() — Выводит стек вызовов функций

Источник

Php method call stack

Чтобы понять, как работают исключения, нужно рассказать о том, что представляет собой стек вызовов. По существу, стек вызовов (call stack) представляет собой запись, в которой указывается очередность вызова функций и методов в сценарии. Рассмотрим следующий пример:

function firstFunction() secondFunction(); > function secondFunction() thirdFunction(); > function thirdFunction() echo "Добро пожаловать!"; > firstFunction();

В процессе выполнения этого сценария функция firstFunction() вызовет функцию secondFunction(), которая, в свою очередь, вызовет функцию thirdFunction(). Что же будет представлять собой стек вызовов, если мы будем находиться внутри вызова функции thirdFunction()? Он будет выглядеть примерно так:

thirdFunction(); secondFunction(); firstFunction();

Теперь становится понятным, что стек вызовов — это ни что иное, как запись очередности вызова функций. Первой функцией, которая была помещена в стек вызовов, является функция firstFunction(), потому что именно она была вызвана первой из всех других функций, а текущая функция, thirdFunction(), находится вверху стека. По мере возврата результата этими функциями они покидают стек до тех пор, пока мы снова не вернемся к ним. Принцип стека вызовов является важной частью обработки исключений, о чем будет сказано далее.

  • Вам незнакомо понятие стека? Можно с вами поспорить, что вы наверняка видели его много раз, но даже представить себе не могли, что это и есть стек. Примером стека компьютера (или стека вызовов, или еще чего-нибудь подобного) в реальном мире является автомат для раздачи леденцов Pez! Вначале он пуст и заполняется по мере помещения в него леденцов. Вытаскивая леденцы, вы достаете их с верхушки автомата. По этому принципу работают и компьютерные стеки. Сначала вы “заталкиваете” данные в стек, а затем “выталкиваете” их обратно по мере необходимости.

Источник

Оцените статью