Search code examples
phpexite-notices

Is there any way to notice E_NOTICE in php code?


I have a PHP script that needs to be executed for hours and hours and sometimes for some reasons (for example network problem while executing of a script which needs to be connected to internet ,etc...) the execution process stops for a while and does wrong thing(and it always causes a E_NOTICE while the process is going to wrong way)

My question is that is there ((any)) way to notice when there is a warning in your script?(And stop the whole script as well)

There is a Pseudocode for my question:

    if( ThereIs(AnyWarning) ) {
    exit("Sorry! You have 1 E_NOTICE so we should stop script!");
    }

I hope you understood what i mean :)

Thank You In Advance!


Solution

  • Check set_error_handler this will be helpful for your requirement. you can exit or you can log error in it. or you can add logic if error/notice occurs in code redirect to error page.

    <?php
    /**
    * Used for logging all php notices,warings and etc in a file when error reporting
    * is set and display_errors is off
    * @uses used in prod env for logging all type of error of php code in a file for further debugging
    * and code performance
    * @author Aditya Mehrotra<[email protected]>
    */
    error_reporting(E_ALL);
    ini_set("display_errors", "off");
    define('ERROR_LOG_FILE', '/var/www/error.log');
    
    /**
    * Custom error handler
    * @param integer $code
    * @param string $description
    * @param string $file
    * @param interger $line
    * @param mixed $context
    * @return boolean
    */
    function handleError($code, $description, $file = null, $line = null, $context = null) {
        $displayErrors = ini_get("display_errors");
        $displayErrors = strtolower($displayErrors);
        if (error_reporting() === 0 || $displayErrors === "on") {
            return false;
        }
        list($error, $log) = mapErrorCode($code);
        $data = array(
            'level' => $log,
            'code' => $code,
            'error' => $error,
            'description' => $description,
            'file' => $file,
            'line' => $line,
            'context' => $context,
            'path' => $file,
            'message' => $error . ' (' . $code . '): ' . $description . ' in [' . $file . ', line ' . $line . ']'
        );
        return fileLog($data);
    }
    
    /**
    * This method is used to write data in file
    * @param mixed $logData
    * @param string $fileName
    * @return boolean
    */
    function fileLog($logData, $fileName = ERROR_LOG_FILE) {
        $fh = fopen($fileName, 'a+');
        if (is_array($logData)) {
            $logData = print_r($logData, 1);
        }
        $status = fwrite($fh, $logData);
        fclose($fh);
        return ($status) ? true : false;
    }
    
    /**
    * Map an error code into an Error word, and log location.
    *
    * @param int $code Error code to map
    * @return array Array of error word, and log location.
    */
    function mapErrorCode($code) {
        $error = $log = null;
        switch ($code) {
            case E_PARSE:
            case E_ERROR:
            case E_CORE_ERROR:
            case E_COMPILE_ERROR:
            case E_USER_ERROR:
                $error = 'Fatal Error';
                $log = LOG_ERR;
                break;
            case E_WARNING:
            case E_USER_WARNING:
            case E_COMPILE_WARNING:
            case E_RECOVERABLE_ERROR:
                $error = 'Warning';
                $log = LOG_WARNING;
                break;
            case E_NOTICE:
            case E_USER_NOTICE:
                $error = 'Notice';
                $log = LOG_NOTICE;
                break;
            case E_STRICT:
                $error = 'Strict';
                $log = LOG_NOTICE;
                break;
            case E_DEPRECATED:
            case E_USER_DEPRECATED:
                $error = 'Deprecated';
                $log = LOG_NOTICE;
                break;
            default :
                break;
        }
        return array($error, $log);
    }
    
    //calling custom error handler
    set_error_handler("handleError");
    
    print_r($arra); //undefined variable
    print_r($dssdfdfgg); //undefined variable
    include_once 'file.php'; //No such file or directory
    ?>