Heim  >  Artikel  >  php教程  >  php异步调试和线上调试网站程序的方法

php异步调试和线上调试网站程序的方法

WBOY
WBOYOriginal
2016-05-25 16:49:161508Durchsuche

当碰到一个网站需要不间断运行,但又需要调试该网站的程序错误的时候,该如何办呢?是靠经验一点点猜测,还是直接打印错误信息让其在页面输出?

下面分享一种方法同时满足这两种条件,既方便网站程序错误调试,又不影响网站的正常运行的调试方法。将下面的php语句复制到公共代码顶部即可,实例代码如下:

//ini_set('error_reporting',E_ALL ^ E_NOTICE);//显示所有除了notice类型的错误信息 
ini_set('error_reporting',E_ALL);//显示所有错误信息 
ini_set('display_errors',off);//禁止将错误信息输出到输出端 
ini_set('log_errors',On);//开启错误日志记录 
ini_set('error_log','C:/phpernote');//定义错误日志存储位置

另外附加两句比较常用的排除错误信息的PHP语句,代码如下:

@ini_set('memory_limit','500M');//设置程序可占用最大内存为500MB
@ini_set('max_execution_time','180');//设置允许程序最长的执行时间为180秒

补充

die()和exit()也是我们常用的php调试一个方法

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.phprm.com/";
fopen($site, "r") or exit("Unable to connect to $site");
?>
<?php
$site = "http://www.phprm.com/";
fopen($site, "r") or die("Unable to connect to $site");
?>

var_dump()和print_r()

var_dump -- 打印变量的相关信息

void var_dump ( mixed expression [, mixed expression [, ...]] )

此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

提示:为了防止程序直接将结果输出到浏览器,可以使用输出控制函数(output-control functions)来捕获此函数的输出,并把它们保存到一个例如 string 类型的变量中,代码如下:

<?php
$a = array(
    1,
    2,
    array(
        "a",
        "b",
        "c"
    )
);
var_dump($a);
$b = 3.1;
$c = TRUE;
var_dump($b, $c);
?>

var_dump()可以输出多个变量,如:var_dump($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() 可让指针回到开始处,代码如下:

<?php
$a = array(
    &#39;a&#39; => &#39;apple&#39;,
    &#39;b&#39; => &#39;banana&#39;,
    &#39;c&#39; => array(
        &#39;x&#39;,
        &#39;y&#39;,
        &#39;z&#39;
    )
);
print_r($a);
?>

上边的代码将输出:

Array ( [a] => apple [b] => banana [c] => Array ( [0] => x [1] => y [2] => z ) ) 

如果想捕捉 print_r() 的输出,可使用 return 参数,若此参数设为 TRUE,print_r() 将不打印结果(此为默认动作),而是返回其输出。

例子:return 参数示例,代码如下:

<?php
$b = array(
    &#39;m&#39; => &#39;monkey&#39;,
    &#39;foo&#39; => &#39;bar&#39;,
    &#39;x&#39; => array(
        &#39;x&#39;,
        &#39;y&#39;,
        &#39;z&#39;
    )
);
$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 自身即是全局变量,其包含了指向自身的引用。

下面的几个函数可以让你随时查看程序中任何变量的类型及其值,代码如下:

<?php
function ss_array_as_string(& $array, $column = 0) {
    $str = "Array(  
\n";
    while (list($var, $val) = each($array)) {
        for ($i = 0; $i < $column+1; $i++) {
            $str.= "    ";
        }
        $str.= $var . == >;;
        $str.= ss_as_string($val, $column+1) . "  
n";
    }
    for ($i = 0; $i < $column; $i++) {
        $str.= "    ";
    }
    return $str .);
}
function ss_object_as_string(& $object, $column = 0) {
    if (emptyempty($object- >;
    classname)) {
        return "$object";
    } else {
        $str = $object- >;
        classname . "(  
n";
        while (list(, $var) = each($object- >;
        persistent_slots)) {
            for ($i = 0; $i < $column; $i++) {
                $str.= "    ";
            }
            global $$var;
            $str.= $var . == >;;
            $str.= ss_as_string($$var, column+1) . "  
n";
        }
        for ($i = 0; $i < $column; $i++) {
            $str.= "    ";
        }
        return $str .);
    }
}
function ss_as_string(& $thing, $column = 0) {
    if (is_object($thing)) {
        return ss_object_as_string($thing, $column);
    } elseif (is_array($thing)) {
        return ss_array_as_string($thing, $column);
    } elseif (is_double($thing)) {
        return "Double(" . $thing . ")";
    } elseif (is_long($thing)) {
        return "Long(" . $thing . ")";
    } elseif (is_string($thing)) {
        return "String(" . $thing . ")";
    } else {
        return "Unknown(" . $thing . ")";
    }
}
?>


教程网址:

欢迎收藏∩_∩但请保留本文链接。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn