堆栈跟踪的PHP警告

时间:2016-06-03 13:40:55

标签: php

是否可以在警告上记录堆栈跟踪?

以下是我记录所有警告和通知错误的方法

function boot_error_handler($errno, $errstr, $errfile, $errline){
    switch($errno){
        case E_WARNING:
        case E_PARSE:
        case E_NOTICE:
            $message = "$errstr $errfile:$errline";
            if(class_exists('Log')){
                Log::write($message, 'warning', true);
            }
            if(ENV != ENV_PROD){
                echo $message;
            }
            break;
    }
}
set_error_handler('boot_error_handler');

3 个答案:

答案 0 :(得分:2)

您可以在错误处理程序中使用debug_backtrace()函数来获取当前堆栈跟踪。问题是它返回关联数组的数组,如果你只需要记录它就会感到不舒服,因为你需要从它生成一个人类可读的字符串。

另一种解决方案是创建Exception实例并使用其方法getTraceAsString()

$exception = new \Exception();
$trace = $exception->getTraceAsString();

所以基本上它取决于默认的exsceptions stacktrace格式是否足够你或者你想要soem自定义格式。

答案 1 :(得分:1)

import httplib
import urllib

params = urllib.urlencode({'gws_rd': 'ssl', 'q': 'hello'})  # search for hello
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
c = httplib.HTTPSConnection("google.com")
c.request("GET", "/", params, headers)
response = c.getresponse()
print response.status, response.reason
data = response.read()
file_ = open('result.html', 'w')
file_.write(data)
file_.close()

是一种生成格式良好的跟踪(PHP 5.4 +)的简便方法

它只会返回一个字符串,因此您可以根据需要用它替换或扩展现有的日志消息。

答案 2 :(得分:1)

使用debug_backtrace()或触发异常,捕获它并使用getTraceAsString()获取它的跟踪:

try {
    throw new Exception();
} catch (Exception $e) {
    $e->getTraceAsString();
}