導航:首頁 > 編程語言 > php調試函數

php調試函數

發布時間:2022-06-03 09:28:03

php寫的微信公眾平台代碼如何進行斷點調試

首先需要說明的是,php程序調試需要手動編寫部分代碼,目的是斷截程序線程的執行,輸出指定環節的結果,就是所謂的斷點調試。所以,實際上需要討論的問題是採用什麼斷點代碼更合適。
die()和exit()
die()和exit()函數都有終止線程的作用,是php斷點調試需要使用的最主要的函數,它們也是php程序員使用非常頻繁的函數。然而兩者又有什麼區別呢?在程序調試時需要注意什麼問題呢?
die()函數一般與「or」一並使用,寫作「or die()」,經常看到這樣的語句:
$file = fopen($filename, 'r') or die("抱歉,無法打開: $filename")
or在這里是這樣理解的,因為在PHP中並不區分數據類型,所以$file既可以是int也可以bool,所以這樣的語句不會報錯。但其處理過程可能有些朋友不大明白。其實在大多數的語言中, bool or bool這樣的語句中,如果前一個值為真後一個值就不會再判斷了。這里也是的,所以如果fopen函數執行正確的話,會返回一個大於0的int值(這其實就是"真"),後面的語句就不會執行了。如果fopen函數執行失敗,就會返回false,那麼就會判斷後面的表達式是否為真了。結果執行了die()之後,不管返回什麼,程序都已經停止執行了,並且顯示指定的出錯信息,也就達到了調試的目的。就這樣。
實際上,die和exit是等價的,都是用來終止當前腳本。
php手冊對兩者的解釋如是說:
exit() 函數輸出一條消息,並退出當前腳本。該函數是 die() 函數的別名。
die() 函數輸出一條消息,並退出當前腳本。該函數是 exit() 函數的別名。
實例:
<?php $site = "http://www.w3school.com.cn/"; fopen($site,"r") or exit("Unable to connect to $site"); ?>
<?php $site = "http://www.w3school.com.cn/"; fopen($site,"r") or die("Unable to connect to $site"); ?>
var_mp()和print_r()
var_mp -- 列印變數的相關信息
void var_mp ( mixed expression [, mixed expression [, ...]] )
此函數顯示關於一個或多個表達式的結構信息,包括表達式的類型與值。數組將遞歸展開值,通過縮進顯示其結構。

提示: 為了防止程序直接將結果輸出到瀏覽器,可以使用輸出控制函數(output-control functions)來捕獲此函數的輸出,並把它們保存到一個例如 string 類型的變數中。
<?php
$a = array (1, 2, array ("a", "b", "c"));
var_mp ($a);
$b = 3.1;
$c = TRUE;
var_mp($b,$c);
?>
var_mp()可以輸出多個變數,如:var_mp($b,$c)
print_r -- 列印關於變數的易於理解的信息
bool print_r ( mixed expression [, bool return] )
注: 參數 return 是在 PHP 4.3.0 的時候加上的
print_r() 顯示關於一個變數的易於理解的信息。如果給出的是 string、integer 或 float,將列印變數值本身。如果給出的是 array,將會按照一定格式顯示鍵和元素。object 與數組類似。
記住,print_r() 將把數組的指針移到最後邊。使用reset() 可讓指針回到開始處。
<pre>
<?php
$a = array ('a' => 'apple',
'b' => 'banana',
'c' => array ('x','y','z'));
print_r ($a);
?>
</pre>
上邊的代碼將輸出:
<pre> Array ( [a] => apple [b] => banana [c] => Array ( [0] => x [1] => y [2] => z ) ) </pre>
如果想捕捉 print_r() 的輸出,可使用 return 參數。若此參數設為 TRUE,print_r() 將不列印結果(此為默認動作),而是返回其輸出。
例子:return 參數示例
<?php
$b = array ('m' => 'monkey',
'foo' => 'bar',
'x' => array ('x', 'y', 'z'));
$results = print_r ($b, true); //$results 包含了 print_r 的輸出結果
?>
注: 如果想在 PHP 4.3.0 之前的版本中捕捉 print_r() 的輸出,可使用輸出控制函數。
注: 在 PHP 4.0.4 之前的版本中,如果給出的 array 或 object 包含了直接或間接指向自身的引用,print_r() 將永遠繼續下去。print_r($GLOBALS) 就是一個例子,因為 $GLOBALS 自身即是全局變數,其包含了指向自身的引用。
Zend Debugger
php斷點調試,有人提到用Zend Debugger,簡單方便,適合菜鳥使用。不過本人因沒有用過,在此不作討論。

㈡ 如何調試PHP的Core之獲取基本信息

首先, 讓生成一個供舉例子的Core文件: <?phpfunction recurse($num) { recurse(++$num);} recurse(0); 運行這個PHP文件: $ php test.phpSegmentation fault (core mped) 這個PHP因為無線遞歸, 會導致爆棧, 從而造成 segment fault而在PHP的當前工作目錄產生Coremp文件(如果你的系統沒有產生Coremp文件, 那請查詢ulimit的相關設置). 好, 現在, 讓刪除掉這個test.php, 忘掉上面的代碼, 我們現在僅有的是這個Core文件, 任務是, 找出這個Core產生的原因, 以及發生時候的狀態. 首先, 讓用gdb打開這個core文件: $ gdb php -c core.31656 會看到很多的信息, 首先讓我們注意這段: Core was generated by `php test.php'.Program terminated with signal 11, Segmentation fault. 他告訴我們Core發生的原因:」Segmentation fault」. 一般來說, 這種Core是最常見的, 解引用空指針, double free, 以及爆棧等等, 都會觸發SIGSEGV, 繼而默認的產生Coremp. 現在讓看看Core發生時刻的堆棧: #0 execute (op_array=0xdc9a70) at /home/laruence/package/php-5.2.14/Zend/zend_vm_execute.h:5353 memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);(gdb) bt#0 execute (op_array=0xdc9a70) at /home/laruence/package/php-5.2.14/Zend/zend_vm_execute.h:53#1 0x00000000006ea263 in zend_do_fcall_common_helper_SPEC (execute_data=0x7fbf400210) at /home/laruence/package/php-5.2.14/Zend/zend_vm_execute.h:234#2 0x00000000006e9f61 in execute (op_array=0xdc9a70) at /home/laruence/package/php-5.2.14/Zend/zend_vm_execute.h:92#3 0x00000000006ea263 in zend_do_fcall_common_helper_SPEC (execute_data=0x7fbf400440) at /home/laruence/package/php-5.2.14/Zend/zend_vm_execute.h:234#4 0x00000000006e9f61 in execute (op_array=0xdc9a70) at /home/laruence/package/php-5.2.14/Zend/zend_vm_execute.h:92#5 0x00000000006ea263 in zend_do_fcall_common_helper_SPEC (execute_data=0x7fbf400670) at /home/laruence/package/php-5.2.14/Zend/zend_vm_execute.h:234..... 不停的按回車, 可以看到堆棧很深, 不停的是zend_do_fcall_common_helper_SPEC和execute的重復, 那麼這基本就能斷定是因為產生了無窮大的遞歸(不能一定說是無窮遞歸, 比如之前文章中介紹深悉正則(pcre)最大回溯/遞歸限制). 從而造成爆棧產生的Core. Ok, 那麼現在讓看看, Core發生在PHP的什麼函數中, 在PHP中, 對於FCALL_* Opcode的handler來說, execute_data代表了當前函數調用的一個State, 這個State中包含了信息: (gdb)f 1#1 0x00000000006ea263 in zend_do_fcall_common_helper_SPEC (execute_data=0x7fbf400210) at /home/laruence/package/php-5.2.14/Zend/zend_vm_execute.h:234234 zend_execute(EG(active_op_array) TSRMLS_CC);(gdb) p execute_data->function_state.function->common->function_name$3 = 0x2a95b65a78 "recurse"(gdb) p execute_data->function_state.function->op_array->filename$4 = 0x2a95b632a0 "/home/laruence/test.php"(gdb) p execute_data->function_state.function->op_array->line_start$5 = 2 現在我們得到, 在調用的PHP函數是recurse, 這個函數定義在/home/laruence/test.php的第二行 經過重復驗證幾個frame, 可以看出, 一直是在重復調用這個PHP函數. 要注意的是, 為了介紹查看執行信息的原理, 我才採用原生的gdb的print來查看, 其實我們還可以使用PHP源代碼中提供的.gdbinit(gdb命令編寫腳本), 來簡單的獲取到上面的信息: (gdb) source /home/laruence/package/php-5.2.14/.gdbinit(gdb) zbacktrace[0xbf400210] recurse() /home/laruence/test.php:3[0xbf400440] recurse() /home/laruence/test.php:3[0xbf400670] recurse() /home/laruence/test.php:3[0xbf4008a0] recurse() /home/laruence/test.php:3[0xbf400ad0] recurse() /home/laruence/test.php:3[0xbf400d00] recurse() /home/laruence/test.php:3[0xbf400f30] recurse() /home/laruence/test.php:3[0xbf401160] recurse() /home/laruence/test.php:3..... 關於.gdbinit, 是一段小小的腳本文件, 定義了一些方便我們去調試PHP的Core, 大家也可以用文本編輯器打開, 看看裡面定義的一些快捷的命令, 一般來說, 我常用的有: zbacktraceprint_ht**系列zmemcheck OK, 回歸正題, 我們現在知道, 問題發生在/home/laruence/test.php的recurse函數的遞歸調用上了. 現在, 讓我們來看看, 在調用這個函數的時候的參數是什麼? PHP的參數傳遞是依靠一個全局Stack來完成的, 也就是EG(argument_stack), EG在非多線程情況下就是executor_globals, 它保持了很多執行狀態. 而argument_statck就是參數的傳遞棧, 保存著對應PHP函數調用層數相當的調用參數. 要注意的是, 這個PHP函數調用堆棧(層數)不和gdb所看到的backtrace簡單的一一對應, 所以參數也不能直接和gdb的backtrace對應起來, 需要單獨分析: //先看看, 最後一次函數調用的參數數目是多少(gdb) p (int )*(executor_globals->argument_stack->top_element - 2)$13 = 1 //再看看, 最後一次函數調用的參數是什麼(gdb) p **(zval **)(executor_globals->argument_stack->top_element - 3)$2 = {value = {lval = 22445, dval = 1.1089303420906779e-319, str = {val = 0x57ad <Address 0x57ad out of bounds>, len = 7}, ht = 0x57ad, obj = {handle = 22445, handlers = 0x7}}, refcount = 2, type = 1 '\001', is_ref = 0 '\0'} 好, 我們現在得到, 最後一次調用的參數是一個整數, 數值是22445 到了這一步, 我們就得到了這個Core發生的時刻的PHP層面的相關信息, 接下來, 就可以交給對應的PHP開發工程師來排查, 這個參數下, 可能造成的無窮大遞歸的原因, 從而修復這個問題..

㈢ PHP 如何調試 下面代碼一執行就崩潰

請在php.ini中設置php的報錯級別,在本地調試時可以設置為error_reporting = E_ALL,作用是Show all errors, except coding standards warnings
同時請關注你的代碼,log()函數是否重復定義了,另外fwrite的原型為int fwrite ( resource $handle , string $string [, int $length ] ),即第一個參數為文件指針;
另外最笨的一個方法就是先將你的函數的代碼全部注釋,然後逐行取消注釋,看一下從哪一行開始出現錯誤。

㈣ PHP調試中有哪些輸出方法

PHP開發中,經常會查看變數的值,因此經常會將變數的值輸出到頁面以便於查看。
常用的輸出方式有:echo、print、print_r、var_mp、var_exprot等;echo和print常用來輸出字元串;
查看數組常用print_r、var_mp、var_exprot;
若使用echo和print輸出數組時則,結果只能顯示"Array",不會顯示數組的結構。
一下舉一例說明幾種用法
配合print "<pre"和print "</pre",以數組$a為例說明各種輸出的區別。
$a = array ('a' = 'apple', 'b' = 'banana', 'c' = array ('x', 'y', 'z'));
print_r($a);輸出結果:Array ( [a] = apple [b] = banana [c] = Array ( [0] = x [1] = y [2] = z ) )
print "<pre"; print_r($a); print "</pre";輸出結果:Array([a] = apple
[b] = banana
[c] = Array([0] = x[1] = y[2] = z))var_mp($a);輸出結果:array(3) { ["a"]= string(5) "apple" ["b"]= string(6) "banana" ["c"]= array(3) { [0]= string(1) "x" [1]= string(1) "y" [2]= string(1) "z" } }
print "<pre"; var_mp($a); print "</pre";輸出結果:array(3) {["a"]=string(5) "apple"["b"]=string(6) "banana"["c"]=array(3) {[0]=string(1) "x"[1]=string(1) "y"[2]=string(1) "z"}}var_export($a);輸出結果:array ( 'a' = 'apple', 'b' = 'banana', 'c' = array ( 0 = 'x', 1 = 'y', 2 = 'z', ), )
print "<pre"; var_export($a); print "</pre";輸出結果:array ('a' = 'apple',
'b' = 'banana',
'c' =array (0 = 'x',
1 = 'y',
2 = 'z',),)調試的時候可以根據不同的需要選用不同的輸出方式。

㈤ php 代碼如何調試

開啟Apache伺服器以及MY_SQL資料庫。

在PHP集成環境的安裝目錄「www」文件夾中創建我們需要用到的php文件,1.php.

用Notepad++打開1.php文件,然後輸入PHP的語言格式:
<?php ?>

輸入標準的輸出語言:
<?php
echo "Hello world !" //輸出Hello world 語言。 echo 是列印的意思
?>

在網頁上輸入localhost:8080/1.php可以調試我們自己寫的php代碼

PHP的簡單運算,用$來定義應用數據,輸出也是一樣。
<?php
$sum=1;
$total=1.22;
$sum=$total+$sum;
echo $sum ?>

㈥ 有哪些 PHP 調試技巧

1、最簡單經典的var_mp()或者echo +exit()
2、配置error_log,能夠解決很多疑難雜症
3、debug方式是:xdebug
4、firebug + firephp或者chrome + chromephp

㈦ php斷點調試的幾種方法

具體代碼如下:
<?php
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, '');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
?>
PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。
它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,
執行效率比完全生成HTML標記的CGI要高許多;
PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。

㈧ 有哪些調試php代碼的方法

用zend
studio
這個開發工具吧
這個上面的ide是集成的
,而且還提供很多強大的插件可以安裝,想要什麼功能都可以安裝插件(svn,vsftp。。。。),目前我用的很順手,建議使用這個軟體;

閱讀全文

與php調試函數相關的資料

熱點內容
人民幣怎麼演算法 瀏覽:754
什麼app可以聽懂刺蝟說話 瀏覽:596
安卓機內存小如何擴大 瀏覽:125
粉絲伺服器怎麼和安卓手機通信 瀏覽:398
初中數學競賽pdf 瀏覽:568
linux自定義安裝 瀏覽:188
fpic要在每個編譯文件 瀏覽:866
編譯原理廣義推導的定義 瀏覽:911
怎麼在已有的壓縮文件里加密碼 瀏覽:517
安卓手機怎麼設置系統軟體 瀏覽:766
php前端java後端 瀏覽:794
數據框轉換為矩陣python 瀏覽:74
單片機程序反匯編 瀏覽:853
編程和實物不一樣 瀏覽:880
天官賜福小說什麼app可看 瀏覽:208
原車空調改壓縮機 瀏覽:103
python調用其它文件中的函數 瀏覽:484
安卓車載大屏如何下載歌詞 瀏覽:959
刪除這些文件夾 瀏覽:675
新建文件夾怎麼設置快捷搜索 瀏覽:503