php调试方法

  • 来源:新网
  • 更新日期:2018-03-20

摘要:前言:这里的调试方法是指找错误,和分析错误的方法。 测试代码最好打开php错误报告,方法有两种一种是在php.ini里面设置。另外一种是使用函数error_reporting。打开php.ini找到error_reporting修改成error_reporting = ALL;当然我们当初是拷贝的开发那份,所以是默认打开的,如果你的关闭了只要修改这里就好了。reporting也有等级区分。以

前言:这里的调试方法是指找错误,和分析错误的方法。

测试代码最好打开php错误报告,方法有两种一种是在php.ini里面设置。另外一种是使用函数error_reporting。打开php.ini找到error_reporting修改成error_reporting = ALL;当然我们当初是拷贝的开发那份,所以是默认打开的,如果你的关闭了只要修改这里就好了。reporting也有等级区分。以后在介绍php.ini的时候详细介绍。

了 (75).jpg

另外如果命令行模式我们一般会加上

1 set_time_limit(0);// 取消php的运行时间限制,让程序可以长时间运行
2 ini_set(\'memory_limit\',\'512M\');//根据需要设置所需要的最大内存数量一般用用不需要设置这行在需要大内存的时候设置下
3 ob_end_flush();//刷新缓冲区运行到哪里显示到哪里,但是在emacs中无法实现,在命令行中可以

在命令行下试试下面的代码吧

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看看效果吧

php调试

一、错误定位

错误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)

然后重启emacs打开一个php文件输入<?php echo “我是个错误的示范” echo ;?>试试C+c d吧是否提示错误啦。

错误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算法错误:这类错误简而言之就是结果和你预期不符合,这样的错误比较难找原因。你需要清晰的逻辑,首先你要知道每一行代码对运算结果的影响,一行一行的输出看看哪一行输出不是预期结果。

二、输出

输出单行用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 functiondump($val){
3 echo\'<pre style="text-align:left;">\';
4 print_r($val);
5 echo\'</pre>\';
6 }
7 ?>

这样在web输出的时候也能够容易读一点只要把这段代码放到要运行的php之前即可。

 

为了调试方便一般会再输出后面加上exit;让代码停止运行。

三、区别正式环境和测试环境

有时候需要正式环境和测试环境内容不同,一个方法是在apache收到请求的时候就在环境里面告诉php是测试环境还是正式环境。就是在虚拟主机里面配置SetEnv ENV “dev”在php代码中可以用$_SERVER[\'ENV\']取得dev这个值当然ENV和dev都是自定义的。这样就可以区分是什么环境了。

另外有时候你想再正式环境运行代码,但是又不能让普通用户看到你的测试代码怎么办呢。可以在地址后面加?__DEBUG__=1来区分,因为普通用户浏览的时候不会知道还有这个参数。而你可以用$_GET[\'__debug__\']==1来判断是不是测试用的。当然__DEBUG__ 和 1是自定义的,你可以选任何你知道。