php調試方法

前言:這裏的調試方法是指找錯誤,和分析錯誤的方法。 php

測試代碼最好打開php錯誤報告,方法有兩種一種是在php.ini裏面設置。另一種是使用函數error_reporting。打開php.ini找到error_reporting修改爲error_reporting = ALL;固然咱們當初是拷貝的開發那份,因此是默認打開的,若是你的關閉了只要修改這裏就行了。reporting也有等級區分。之後在介紹php.ini的時候詳細介紹。 web

另外若是命令行模式咱們通常會加上 算法

1 set_time_limit(0); // 取消php的運行時間限制,讓程序能夠長時間運行
2 ini_set('memory_limit','512M'); //根據須要設置所須要的最大內存數量通常用用不須要設置這行在須要大內存的時候設置下
3 ob_end_flush();//刷新緩衝區運行到哪裏顯示到哪裏,可是在emacs中沒法實現,在命令行中能夠

在命令行下試試下面的代碼吧 shell

01 <?php
02  
03 set_time_limit(0);
04 ini_set('memory_limit','512m');
05 ob_start();
06 ob_end_flush();
07  
08 echo "我開始了";
09 for($i=0;$i<70;$i++){
10 sleep(1);
11 echo $i."\n";
12 }
13 echo "我結束了";
14 ?>

將這段代碼保存到d:/www/test/a.php而後到cmd中運行php  d:/www/test/a.php看看效果吧 apache

php調試

php調試 數組

1、錯誤定位

錯誤1語法錯誤:這類錯誤最容易定位,不管是web程序仍是命令行程序,都會給出出錯的行,而後你根據出錯的行去修改調試,直到正確。還記得emacs C+c r今天再教你們一個C+c d 修改.emacs文件在如下代碼的上方 函數

1 (define-key php-mode-map
2   [menu-bar php php-run]
3   '("Run PHP" . php-run))

加入 測試

01 (define-key php-mode-map
02   [menu-bar php php-debug]
03   '("PHP Debug" . php-debug))
04  
05 (defun php-debug ()
06   (interactive)
07   (shell-command
08    (concat "C:/php/php.exe -f \""
09            (buffer-file-name)
10            "\"")))

在(define-key php-mode-map [(control c) (r)] ‘php-run)下一行加入(define-key php-mode-map [(control c) (d)] ‘php-debug) spa

而後重啓emacs打開一個php文件輸入<?php echo 「我是個錯誤的示範」 echo ;?>試試C+c d吧是否提示錯誤啦。 .net

錯誤2沒有運行:這類錯誤是指運行過程當中中斷了,調試這類錯誤我一般是在有可能出錯的地方先後加入echo 「num」;好比以下代碼

1 <?php
2 echo "1";
3 if(0 && true){
4   echo "2";
5   echo "我不會輸出";
6 }
7 echo "3";
8 ?>

也許你對&&理解有誤致使了這個問題,上面的代碼將輸出13而2沒有輸出因此是if判斷有問題。

錯誤3算法錯誤:這類錯誤簡而言之就是結果和你預期不符合,這樣的錯誤比較難找緣由。你須要清晰的邏輯,首先你要知道每一行代碼對運算結果的影響,一行一行的輸出看看哪一行輸出不是預期結果。

2、輸出

輸出單行用echo,print。爲了輸出美觀點,通常在命令行模式好比你在用C+c r調試的時候通常在後面跟着輸出」\n」好比<?php echo 「測試輸出\n」;echo 「測試輸出\n」;?>而在web調試的時候輸出」<br />」好比<?php echo 「測試輸出<br />」; echo 「測試輸出<br />」;?>

輸出其餘類型能夠用var_dump、print_r、var_export,固然這些函數也能夠打印字符串,只是多打幾個字母而已。其中var_dump和var_export相似只是打印出數組或對象的字符串形式,而var_dump還會打印出變量的類型,而print_r打印出的內容更容易閱讀。試試下面的代碼吧。

01 <?php
02 $str = "我是字符串";
03 $arr = array(1,array(2,3,"我是數組的一部分"));
04  
05 echo $str;
06 echo "\n";
07 echo $arr;
08 echo "\n";
09 print $str;
10 echo "\n";
11 print $arr;
12 echo "\n";
13 var_dump($str);
14 echo "\n";
15 var_dump($arr);
16 echo "\n";
17 print_r($str);
18 echo "\n";
19 print_r($arr);
20 echo "\n";
21 var_export($str);
22 echo "\n";
23 var_export($arr);
24 echo "我有雙\"引號\"";
25 echo "我有直接引用,$str";
26 echo "我有連接符"."我是被連接的字符串";
27 ?>

上例中的最後三行,顯示了幾種常見用法。即字符串中有和包裹字符串的引號相同時使用反斜槓來區分好比」我是\」雙引號\」"  ’\'我是單引號\」,若是單引號和雙引號混用時要注意包裹範圍。字符串和字符串之間用.來連接。

這裏告訴你們一個更加實用的函數

1 <?php
2  function dump($val){
3          echo '<pre style="text-align:left;">';
4          print_r($val);
5          echo  '</pre>';
6  }
7  ?>

這樣在web輸出的時候也可以容易讀一點只要把這段代碼放到要運行的php以前便可。

 

爲了調試方便通常會再輸出後面加上exit;讓代碼中止運行。

3、區別正式環境和測試環境

有時候須要正式環境和測試環境內容不一樣,一個方法是在apache收到請求的時候就在環境裏面告訴php是測試環境仍是正式環境。就是在虛擬主機裏面配置SetEnv ENV 「dev」在php代碼中能夠用$_SERVER['ENV']取得dev這個值固然ENV和dev都是自定義的。這樣就能夠區分是什麼環境了。

另外有時候你想再正式環境運行代碼,可是又不能讓普通用戶看到你的測試代碼怎麼辦呢。能夠在地址後面加?__DEBUG__=1來區分,由於普通用戶瀏覽的時候不會知道還有這個參數。而你能夠用$_GET['__debug__']==1來判斷是否是測試用的。固然__DEBUG__ 和 1是自定義的,你能夠選任何你知作別人不知道的字符串來測試。

本文固定連接: http://www.qaforcode.net/archives/172 | 豬哥每日一貼

相關文章
相關標籤/搜索