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();

我的PHP应用程序中有一个自定义错误处理程序,我希望在错误发生时得到定义的变量

为了实现这一点,我使用以下代码:

    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 :-)
?>

从一个简单的google
php中获得,显示所有变量。共享(“全局”)范围是您可能看到的唯一内容。父函数作用域不可访问。唯一的选择是。但这对您的自定义错误处理程序没有帮助。@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 :-)
?>