¿Cómo puedo obtener mensajes de error útiles en PHP?

Resuelto Candidasa asked hace 54 años • 41 respuestas

Muy a menudo intento ejecutar un script PHP y aparece una pantalla en blanco. Ningún mensaje de error; solo una pantalla vacía. La causa podría haber sido un simple error de sintaxis (corchete incorrecto, falta punto y coma), una llamada de función fallida o algo completamente distinto.

Es muy difícil descubrir qué salió mal. Termino comentando el código, ingresando declaraciones de "eco" en todas partes, etc., tratando de reducir el problema. Pero seguramente debe haber una manera mejor, ¿verdad?

¿Hay alguna manera de hacer que PHP produzca un mensaje de error útil, como lo hace Java?

Candidasa avatar Jan 01 '70 08:01 Candidasa
Aceptado

De forma predeterminada, la visualización de errores está desactivada porque no desea que un "cliente" vea los mensajes de error.

Consulte esta página en la documentación de PHP para obtener información sobre las 2 directivas: error_reportingy display_errors. display_errorsProbablemente sea el que quieras cambiar.

Entonces tienes 3 opciones:

(1) Puede consultar el archivo de registro de errores, ya que tendrá todos los errores (a menos que se haya deshabilitado el registro). Para habilitar el registro de errores, asegúrese de que log_errorsla directiva de configuración esté configurada en On. Los registros también son útiles cuando el error no ocurre en PHP sino que lo emite el servidor web.

(2) Puede agregar las siguientes 2 líneas que lo ayudarán a depurar errores que no son errores de sintaxis ocurridos en el mismo archivo:

error_reporting(E_ALL);
ini_set('display_errors', 'On');

Tenga en cuenta que en un servidor en vivo se debe configurar este último Off(pero solo el último, porque aún necesita conocer todos los errores ocurridos, desde el archivo de registro).

Sin embargo, para los errores de sintaxis ocurridos en el mismo archivo, los comandos anteriores no funcionarán y deberá habilitarlos en php.ini. Si no puede modificar php.ini, también puede intentar agregar las siguientes líneas a un archivo .htaccess, aunque rara vez se admite hoy en día:

php_flag  display_errors        on
php_value error_reporting       -1

(3) Otra opción es utilizar un editor que busque errores al escribir, como PhpEd , VSCode o PHPStorm. Todos vienen con un depurador que puede proporcionar información más detallada. (El depurador PhpEd es muy similar a xdebug y se integra directamente en el editor, por lo que puedes usar 1 programa para hacer todo).

Darryl Hein avatar May 10 '2009 09:05 Darryl Hein

Lo siguiente habilita todos los errores:

ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);

Consulte también los siguientes enlaces

  • http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors
  • http://php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors
  • http://php.net/manual/en/function.error-reporting.php
Eljakim avatar Jul 04 '2011 19:07 Eljakim

El siguiente código debería mostrar todos los errores:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 => 'E_ERROR',
        0x0002 => 'E_WARNING',
        0x0004 => 'E_PARSE',
        0x0008 => 'E_NOTICE',
        0x0010 => 'E_CORE_ERROR',
        0x0020 => 'E_CORE_WARNING',
        0x0040 => 'E_COMPILE_ERROR',
        0x0080 => 'E_COMPILE_WARNING',
        0x0100 => 'E_USER_ERROR',
        0x0200 => 'E_USER_WARNING',
        0x0400 => 'E_USER_NOTICE',
        0x0800 => 'E_STRICT',
        0x1000 => 'E_RECOVERABLE_ERROR',
        0x2000 => 'E_DEPRECATED',
        0x4000 => 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

La única forma de generar una página en blanco con este código es cuando tiene un error en el controlador de apagado. Copié y pegué esto desde mi propio cms sin probarlo, pero estoy seguro de que funciona.

m4dm4x1337 avatar Aug 13 '2013 11:08 m4dm4x1337

Puede incluir las siguientes líneas en el archivo que desea depurar:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Esto anula la configuración predeterminada en php.ini, que simplemente hace que PHP informe los errores al registro.

Tomalak avatar May 10 '2009 09:05 Tomalak

Los errores y advertencias generalmente aparecen en la configuración de php.ini ....\logs\php_error.logo dependiendo de ella.....\logs\apache_error.log

También los errores útiles suelen dirigirse al navegador, pero como no son HTML válido no se muestran.

Entonces, "tail -f"sus archivos de registro y cuando obtenga una pantalla en blanco use las opciones del menú "ver" -> "fuente" de IE para ver el resultado sin procesar.

James Anderson avatar Sep 25 '2009 04:09 James Anderson