How to catch undefined functions with set_error_handler in PHP

后端 未结 6 557
一整个雨季
一整个雨季 2021-02-05 19:47

I\'m taking the leap: my PHP scripts will ALL fail gracefully!

At least, that\'s what I\'m hoping for...`

I don\'t want to wrap (practically) every single line i

6条回答
  •  無奈伤痛
    2021-02-05 20:46

    I've been playing around with error handling for some time and it seems like it works for the most part.

    function fatalHandler() {
        global $fatalHandlerError, $fatalHandlerTitle;
    
        $fatalHandlerError = error_get_last();
    
        if( $fatalHandlerError !== null ) {
    
            print($fatalHandlerTitle="{$fatalHandlerTitle} | ".join(" | ", $fatalHandlerError).
                    (preg_match("/memory/i", $fatalHandlerError["message"]) ? " | Mem: limit ".ini_get('memory_limit')." / peak ".round(memory_get_peak_usage(true)/(1024*1024))."M" : "")."\n".
                            "GET: ".var_export($_GET,1)."\n".
                            "POST: ".var_export($_POST,1)."\n".
                            "SESSION: ".var_export($_SESSION,1)."\n".
                            "HEADERS: ".var_export(getallheaders(),1));
        }
    
        return $fatalHandlerTitle;
    }
    
    function fatalHandlerInit($title="phpError") {
        global $fatalHandlerError, $fatalHandlerTitle;
    
        $fatalHandlerTitle = $title;
        $fatalHandlerError = error_get_last();
    
        set_error_handler( "fatalHandler" );
    }
    

    Now I have an issue where if the memory is exhausted, it doesn't report it every time. It seems like it depends on how much memory is being used. I did a script to load a large file (takes ~6.6M of memory) in an infinite loop. Setup1:

    ini_set('memory_limit', '296M');
    
    fatalHandlerInit("testing");
    
    $file[] = file("large file"); // copy paste a bunch of times
    

    In this case I get the error to be reports and it dies on 45 file load.

    Setup2 - same but change: ini_set('memory_limit', '299M');

    This time I don't get an error and it doesn't even call my custom error function. The script dies on the same line.

    Does anyone have a clue why and how to go around that?

提交回复
热议问题