¿Cómo detecto un error fatal de PHP (`E_ERROR`)?

Resuelto too much php asked hace 54 años • 0 respuestas

Puedo usarlo set_error_handler()para detectar la mayoría de los errores de PHP, pero no funciona para casos fatales (E_ERROR errores fatales (), como llamar a una función que no existe. ¿Existe otra forma de detectar estos errores?

Estoy intentando solucionar mail()todos los errores y estoy ejecutando PHP 5.2.3.

too much php avatar Jan 01 '70 08:01 too much php
Aceptado

Registre errores fatales usando register_shutdown_function, que requiere PHP 5.2+:

register_shutdown_function( "fatal_handler" );

function fatal_handler() {
    $errfile = "unknown file";
    $errstr  = "shutdown";
    $errno   = E_CORE_ERROR;
    $errline = 0;

    $error = error_get_last();

    if($error !== NULL) {
        $errno   = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr  = $error["message"];

        error_mail(format_error( $errno, $errstr, $errfile, $errline));
    }
}

Tendrás que definir las funciones error_maily format_error. Por ejemplo:

function format_error( $errno, $errstr, $errfile, $errline ) {
    $trace = print_r( debug_backtrace( false ), true );

    $content = "
    <table>
        <thead><th>Item</th><th>Description</th></thead>
        <tbody>
            <tr>
                <th>Error</th>
                <td><pre>$errstr</pre></td>
            </tr>
            <tr>
                <th>Errno</th>
                <td><pre>$errno</pre></td>
            </tr>
            <tr>
                <th>File</th>
                <td>$errfile</td>
            </tr>
            <tr>
                <th>Line</th>
                <td>$errline</td>
            </tr>
            <tr>
                <th>Trace</th>
                <td><pre>$trace</pre></td>
            </tr>
        </tbody>
    </table>";
    return $content;
}

Utilice Swift Mailer para escribir la error_mailfunción.

Ver también:

  • $php_errormsg
  • Constantes predefinidas
user259973 avatar Jan 27 '2010 10:01 user259973

Se me ocurrió esta solución (PHP 5.2.0+):

function shutDownFunction() {
    $error = error_get_last();
     // Fatal error, E_ERROR === 1
    if ($error['type'] === E_ERROR) {
         // Do your stuff
    }
}
register_shutdown_function('shutDownFunction');

Se definen diferentes tipos de errores en Constantes predefinidas .

periklis avatar Aug 02 '2010 15:08 periklis