av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

PHP如何打印跟蹤調(diào)試信息

瀏覽:99日期:2022-09-07 16:04:35

對于大部分編譯型語言來說,比如 C 、 Java 、 C# ,我們都能很方便地進(jìn)行斷點調(diào)試,但是 PHP 則必須安裝 XDebug 并且在編輯器中進(jìn)行復(fù)雜的配置才能實現(xiàn)斷點調(diào)試的能力。不過,如果只是簡單的調(diào)試并且查看堆棧回溯的話,其實 PHP 已經(jīng)為我們準(zhǔn)備好了兩個函數(shù),能夠讓我們非常方便的看到程序運行時的調(diào)用情況。

debug_backtrace()

從這個方法的字面意思上就可以看出,它的意思就是調(diào)試回溯,返回的也正是一段回溯信息的數(shù)組。

function a_test($str){ echo 'Hi: $str', PHP_EOL; var_dump(debug_backtrace());}var_dump(debug_backtrace());a_test('A');// Hi: A/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:7:// array(1) {// [0] =>// array(4) {// ’file’ =>// string(93) '/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php'// ’line’ =>// int(12)// ’function’ =>// string(6) 'a_test'// ’args’ =>// array(1) {// [0] =>// string(1) 'A'// }// }// }

這個方法必須在函數(shù)中調(diào)用,在函數(shù)方法外部使用是不會有內(nèi)容的。從內(nèi)容中看,它輸出了關(guān)于這個函數(shù)的 __FILE__ 、 __LINE__ 、 __FUNCTION__ 、$argv 等信息。其實就是關(guān)于當(dāng)前打印這行所在函數(shù)的相關(guān)內(nèi)容。

我們當(dāng)然也可以多嵌套幾層函數(shù)來看一下打印出的內(nèi)容是什么。

function b_test(){ c_test();}function c_test(){ a_test('b -> c -> a');}b_test();// Hi: b -> c -> a// /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:7:// array(3) {// [0] =>// array(4) {// ’file’ =>// string(93) '/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php'// ’line’ =>// int(37)// ’function’ =>// string(6) 'a_test'// ’args’ =>// array(1) {// [0] =>// string(11) 'b -> c -> a'// }// }// [1] =>// array(4) {// ’file’ =>// string(93) '/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php'// ’line’ =>// int(33)// ’function’ =>// string(6) 'c_test'// ’args’ =>// array(0) {// }// }// [2] =>// array(4) {// ’file’ =>// string(93) '/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php'// ’line’ =>// int(40)// ’function’ =>// string(6) 'b_test'// ’args’ =>// array(0) {// }// }// }

沒錯,數(shù)組的輸出順序就是一個棧的執(zhí)行順序,b_test() 最先調(diào)用,所以它在棧底,對應(yīng)的輸出也就是數(shù)組中的最后一個元素。

在類中也是類似的使用方法。

class A{ function test_a(){$this->test_b(); } function test_b(){var_dump(debug_backtrace()); }}$a = new A();$a->test_a();// /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:90:// array(2) {// [0] =>// array(7) {// ’file’ =>// string(93) '/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php'// ’line’ =>// int(87)// ’function’ =>// string(6) 'test_b'// ’class’ =>// string(1) 'A'// ’object’ =>// class A#1 (0) {// }// ’type’ =>// string(2) '->'// ’args’ =>// array(0) {// }// }// [1] =>// array(7) {// ’file’ =>// string(93) '/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php'// ’line’ =>// int(95)// ’function’ =>// string(6) 'test_a'// ’class’ =>// string(1) 'A'// ’object’ =>// class A#1 (0) {// }// ’type’ =>// string(2) '->'// ’args’ =>// array(0) {// }// }// }

在類中使用的時候,在數(shù)組項中會多出一個 object 字段,顯示的是這個方法所在類的信息。

debug_backtrace() 的函數(shù)聲明是:

debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array

其中 options 是有兩個常量可以定義,DEBUG_BACKTRACE_PROVIDE_OBJECT 表明是否填充 'object' 的索引;DEBUG_BACKTRACE_IGNORE_ARGS 是否忽略 'args' 的索引,包括所有的 function/method 的參數(shù),能夠節(jié)省內(nèi)存開銷。limits 可用于限制返回堆棧幀的數(shù)量,默認(rèn)為0返回所有的堆棧。

debug_backtrace() 以及下面要介紹的 debug_print_backtrace() 方法都是支持 require/include 文件以及 eval() 中的代碼的,在嵌入文件時,會輸出嵌入文件的路徑,這個大家可以自行嘗試。

debug_print_backtrace()

這個方法從名稱也可以看出,它會直接打印回溯內(nèi)容,它的函數(shù)聲明和 debug_backtrace() 是一樣的,不過 $options 默認(rèn)是 DEBUG_BACKTRACE_IGNORE_ARGS ,也就是說,它只打印調(diào)用所在文件及行數(shù)。

function a() { b();}function b() { c();}function c(){ debug_print_backtrace();}a();#0 c() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:144]#1 b() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:140]#2 a() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:151]

另外就是這個函數(shù)不需要使用 var_dump() 或 print_r() 進(jìn)行輸出,直接使用這個函數(shù)就會進(jìn)行輸出。能夠非常快捷方便的讓我們進(jìn)行調(diào)試,比如在 laravel 這類大型框架中,我們在控制器需要查看堆棧信息時,就可以使用 debug_print_backtrace() 快速地查看當(dāng)前的堆棧調(diào)用情況。而 debug_backtrace() 如果沒有指定 $options 的話,則會占用非常大的內(nèi)存容量或者無法完整顯示。

總結(jié)

今天介紹的這兩個函數(shù)能夠靈活地幫助我們調(diào)試代碼或者了解一個框架的調(diào)用情況。當(dāng)然,在正式的情況下還是推薦使用 Xdebug 加上編輯器的支持來進(jìn)行斷點調(diào)試,因為使用 debug_backtrace() 這兩個方法我們無法看到變量的變化情況。

測試代碼:

github.com/zhangyue050…

以上就是PHP如何打印跟蹤調(diào)試信息的詳細(xì)內(nèi)容,更多關(guān)于PHP打印調(diào)試信息的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 九九在线视频 | 久久久91精品国产一区二区精品 | 狠狠色狠狠色综合日日92 | 日本三级网站在线观看 | 日本三级网站在线观看 | 亚洲一卡二卡 | 国产日产精品一区二区三区四区 | 成人免费视频观看视频 | 欧美精品91 | 精品中文字幕一区二区三区 | av三级| 精品欧美乱码久久久久久1区2区 | 欧美一区二区三区四区在线 | 91网站视频在线观看 | 成年人网站免费 | 日韩成人av在线 | 福利电影在线 | 国产97碰免费视频 | 精品视频在线免费观看 | 玖玖在线免费视频 | 国产一区精品在线 | 国产伦精品一区二区 | 综合二区 | www精品美女久久久tv | 国产精品自在线 | 国产美女永久免费无遮挡 | 亚洲在线视频 | 日本精品一区二区三区在线观看 | 精品一区av| 日韩av一区二区在线 | 久久丝袜视频 | 免费福利视频一区二区三区 | 日本精品视频在线观看 | 日本不卡一区二区三区在线观看 | 久久精品亚洲精品国产欧美 | 国产精品久久久久久中文字 | 一区二区三区视频在线 | 91国产视频在线观看 | 中文字幕在线观看视频一区 | 日韩av成人在线观看 | 国产国拍亚洲精品av |