调试--几种调试php的方法

一 , 使用PHP内置的异常处理类

参考php手册:

try catch throw Exception抛出异常

php异常处理程序应当包括:

Throw - 定义异常:在程序需要的位置定义触发异常满足的条件; (if( xx ) { throw new Exception("") }

Try -  调用含可抛出一个异常的语句:使用其位于 "try" 代码块内;( try { aaa( ); }

Catch - 捕获异常:"catch" 代码块(即 catch(Exception $e) { $e->getMessage() })中会捕获异常,并创建一个包含异常信息的对象($e)

说明:每一个try至少要有一个与之对应的catch。使用多个catch 可以捕获不同的类所产生的异常。

try 代码块不再抛出异常或者找不到 catch能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch的后面继续执行。当然,PHP 允许在catch代码块内再次抛出(throw)异常。当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出Uncaught Exception ... (未捕获异常)的提示信息。(???)


Example #1 抛出一个异常

< ![CDATA[
<?php
//定义一个含抛出异常的函数
function inverse($x) {
if (!
$x) {
throw new
Exception('Division by zero.');
}
else return
1/$x;
}

//调用:
try {
echo
inverse(5) ."\n";
echo
inverse(0) ."\n";
} catch (
Exception $e) {
echo
'Caught exception: ',$e->getMessage(),"\n";
}

// Continue execution
echo 'Hello World';
?>

以上例程会输出:

0.2 //第一次合法执行输出结果
Caught exception: Division by zero. //第二次捕获到异常
Hello World  //因为异常被处理,所以后面程序继续执行

Example #2 嵌套的异常

<?php
class MyException extends Exception { }
class Test {
    public function testing() {
        try {
            try {
                throw new MyException('foo!');
            } catch (MyException $e) {
                /* rethrow it */
                throw $e;
            }
        } catch (Exception $e) {
            var_dump($e->getMessage());
        }
    }
}

$foo = new Test;
$foo->testing();
?> 

以上例程会输出:

string(4) "foo!"

二 ,写入到日志文件

1)fopen,fwrite, fclose自定义写入

define('WEB_ROOT_DIR' , dirname(__FILE__).'/../');
        $fp = fopen(WEB_ROOT_DIR.'/log.txt',  'a+');   (自动或者手动创建文件后必须给777权限)
        fwrite($fp, $content);
        fclose($fp);

 2)php函数:error_log()

boolerror_log (string$message [,int$message_type = 0 [,string$destination [,string$extra_headers ]]] )

error_log() 函数向服务器错误记录、文件或远程目标发送一个错误。

例:

error_log(" You messed up!\r\n",3,"/var/tmp/my-errors.log"); //写入文件

error_log(" You messed up!\r\n" , 1,"test@test.com","From: server@test.com"); //发送邮件日志

参数 描述
error 必需。要记录的错误消息。
type

可选。规定错误记录的类型。

可能的记录类型:

  • 0 - 默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件。
  • 1 - 错误被发送到 destination 参数中的地址。只有该类型使用 headers 参数。
  • 2 - 通过 PHP debugging 连接来发送错误。该选项只在 PHP 3 中可用。
  • 3 - 错误发送到文件目标字符串。
destination 可选。规定向何处发送错误消息。该参数的值依赖于 "type" 参数的值。
headers

可选。只在 "type" 为 1 时使用。

规定附加的头部,比如 From, Cc 以及 Bcc。由 CRLF (\r\n) 分隔。

注释:在发送电子邮件时,必须包含 From 头部。可以在 php.ini 文件中或者通过此参数设置。

3)结合ob缓冲区,写文件

对于无法在屏幕显示,或者不允许有输出的情况,可以结合写日志,和缓冲区来达到测试记录的目的:

var_dump是直接推送到浏览器,可以用ob将其包住,再用函数取出输出的内容,这样数组就可以转成字符串,写log文件了。 

ob_start();

var_dump($_COOKIE);

var_dump($this->user);

$content = ob_get_contents();

ob_end_clean();


$fp = fopen(WEB_ROOT_DIR.'/er.txt', 'a+');

fwrite($fp, '++'.$content);

fclose($fp);

三 ,直接输出到浏览器

参考文章:http://www.cnblogs.com/coxsoft/archive/2012/08/30/2664373.html

1. echo ,这是最简单的输出数据调试方法,一般用来输出变量值,或者你不确定程序执行到了哪个分支的情况下时用。

2. var_dump($val1, $val2, ....) 会额外输出数据类型,可以打印多个变量

3. print_r 输出:格式很整齐,跟 var_dump 的区别是没有类型数据,并且布尔值的false和值NULL输出为空

4. mixedvar_export ( mixed$expression [,bool$return ] ): 输出或返回一个变量的字符串表示

第二个参数无时与var_dump相同,为true时,不再输出,而是返回该变量的字符串标示,可以赋值给其他变量

另外,当变量为resource类型时,var_export会返回NULL 

四 ,断点调试

die()是exit()的别名;输出一个消息并且退出当前脚本。

例:exit('Line:'.__LINE__) 来截断程序,同时可以输出定位行数。

void exit( $status);

注意:参数为string时,在退出之前该函数会打印$status; 如果 status 是一个 integer,该值会作为退出状态码,并且不会被打印输出。

五 ,使用调试工具

xdebug

详细参考另外一篇文章http://blog.csdn.net/breeze_life/article/details/9923517



<< By  breeze_life,转载请注明出处:  http://blog.csdn.net/breeze_life/article/details/7759092  >>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值