PHP中发生错误时如何获取所有变量
我的PHP应用程序中有一个自定义错误处理程序,我希望在错误发生时得到定义的变量 为了实现这一点,我使用以下代码:PHP中发生错误时如何获取所有变量,php,error-handling,Php,Error Handling,我的PHP应用程序中有一个自定义错误处理程序,我希望在错误发生时得到定义的变量 为了实现这一点,我使用以下代码: function error_handler($errno, $errstr, $errfile, $errline){ ..some stuff.. ob_start(); var_dump(get_defined_vars()); $environment = ob_get_clean();
function error_handler($errno, $errstr, $errfile, $errline){
..some stuff..
ob_start();
var_dump(get_defined_vars());
$environment = ob_get_clean();
..some other stuff..
}
发生的情况是,它只返回错误处理程序中定义的变量。我希望这段代码返回所有变量,而不仅仅是错误处理程序中定义的变量。这里是否有我不理解的范围问题,或者问题来自其他地方?因此,在考虑了其他人的答案并在互联网上进一步查看之后,我提出了另一种解决方案,可以帮助我在调试错误时获得更多信息 PHP中的debug_print_backtrace函数:
正如mario提到的,我可以在xdebug上添加一个钩子,最终将其转储到文件中。但不确定这是否可行 我通过创建一个文件来修复它,在该文件中,我将每个变量都存储在错误之前,并结合自定义错误处理 php:(注意这不是一个函数,只是包含在页面中的一些代码)
error_log.php:(自定义错误处理程序)
例如:
<?php
$a=1;
$b=0;
include("./getvars.php");
require_once("./error_log.php");
echo $a/$b; //an error :-)
?>
从一个简单的googlephp中获得,显示所有变量。共享(“全局”)范围是您可能看到的唯一内容。父函数作用域不可访问。唯一的选择是。但这对您的自定义错误处理程序没有帮助。@RiggsFolly您看过我的示例吗?@mario我可以在xdebug的堆栈跟踪被触发时将其转储到文件中。谢谢你的想法。当你知道这里可能会发生错误时,这是很有用的,事实上这就是我所做的。但是,当您不知道是否会发生错误时,它不是很有用,因为我无法在执行每个操作之前转储所有变量。谢谢分享你的代码,在某些情况下它可能会帮助人们:)我知道。如果您在页面开始时转储变量(就在您开始“真实”代码的上方),这样您就可以知道从_get和_post请求中获得的一些变量的值,那么这将非常有用。如果出现错误,您至少有一些基本信息,可以在右行上方添加vardump,因为错误将在某个点再次发生:-)
<?php
set_error_handler("errorHandler");
register_shutdown_function("shutdownHandler");
function errorHandler($error_level, $error_message, $error_file, $error_line, $error_context){
$error = $error_message." | ".$error_file." | line:".$error_line;
switch ($error_level) {
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_PARSE:
mylog($error, "(fatal)");
break;
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
mylog($error, "(error)");
break;
case E_WARNING:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_USER_WARNING:
mylog($error, "(warn)");
break;
case E_NOTICE:
case E_USER_NOTICE:
mylog($error, "(info)");
break;
case E_STRICT:
mylog($error, "(debug)");
break;
default:
mylog($error, "(warn default)");
}
}
function shutdownHandler(){ //will be called when php script ends.
$lasterror = error_get_last();
if($lasterror!=null){
switch ($lasterror['type']){
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
case E_RECOVERABLE_ERROR:
case E_WARNING:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_USER_WARNING:
case E_NOTICE:
case E_USER_NOTICE:
case E_STRICT:
case E_PARSE:
$error = $lasterror['message']." | ".$lasterror['file']." | line:".$lasterror['line'];
mylog($error, "fatal");
}
}
}
function mylog($error, $errlvl){
$ip=$_SERVER['REMOTE_ADDR'];
error_log($error." ".$errlvl."\n"."https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI] ",0);
$filename=$_SERVER['DOCUMENT_ROOT']."/tmp/".$ip.".txt";
if (file_exists($filename)){ //read the file and add it to the log
$file=fopen($filename, "r");
$variables=fread($file, filesize($filename));
error_log("Variables: ".$variables,0);
}
}
?>
<?php
$a=1;
$b=0;
include("./getvars.php");
require_once("./error_log.php");
echo $a/$b; //an error :-)
?>