博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php调试方法
阅读量:6938 次
发布时间:2019-06-27

本文共 3051 字,大约阅读时间需要 10 分钟。

hot3.png

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

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

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

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  function dump($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是自定义的,你可以选任何你知道别人不知道的字符串来测试。

本文固定链接: 

转载于:https://my.oschina.net/u/874560/blog/98076

你可能感兴趣的文章
CodeVS 1008 选数(DFS)
查看>>
SQL Server日常积累
查看>>
C++强制类型转换
查看>>
搭建FTP服务器 window7
查看>>
并发编程下的性能定律(翻译)
查看>>
cssText文本格式化
查看>>
新建koa2项目
查看>>
Phoenix 索引生命周期
查看>>
I,P,B帧和PTS,DTS的关系
查看>>
JavaOO练习:违规管理系统
查看>>
继续开始列车式的生活
查看>>
String的属性和方法
查看>>
hdu-1800
查看>>
读写锁-锁粒度
查看>>
C#_delegate - 用委托实现事件,Display和Log类都使用Clock对象
查看>>
java.net.BindException: 权限不够
查看>>
《c程序设计语言》读书笔记-字符型0-9转为数字0-9
查看>>
公务员队伍开始动荡了吗?
查看>>
项目中解决实际问题的代码片段-javascript方法,Vue方法(长期更新)
查看>>
sdut 1500 Message Flood(Trie树)
查看>>