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

May 10 2009

Muy a menudo intentaré ejecutar un script PHP y volveré a tener una pantalla en blanco. Sin mensaje de error; solo una pantalla vacía. La causa podría haber sido un simple error de sintaxis (corchete incorrecto, falta de punto y coma), una llamada de función fallida, o algo completamente diferente.

Es muy difícil averiguar 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 mejor manera, ¿verdad?

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

Respuestas

510 DarrylHein May 10 2009 at 16:52

Para errores de sintaxis, debe habilitar la visualización de errores en php.ini. De forma predeterminada, estos están desactivados 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_errorses probablemente el que desea cambiar. Si no puede modificar php.ini, también puede agregar las siguientes líneas a un archivo .htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

Es posible que desee considerar usar el valor de E_ALL (como lo menciona Gumbo) para su versión de PHP para error_reportingobtener todos los errores. más información

Otros 3 elementos: (1) Puede comprobar el archivo de registro de errores, ya que tendrá todos los errores (a menos que se haya desactivado el registro). (2) Agregar las siguientes 2 líneas lo ayudará a depurar errores que no son errores de sintaxis:

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

(3) Otra opción es utilizar un editor que busque errores al escribir, como PhpEd . PhpEd también viene con un depurador que puede proporcionar información más detallada. (El depurador de PhpEd es muy similar a xdebug y se integra directamente en el editor, por lo que usa 1 programa para hacer todo).

El enlace de Cartman también es muy bueno:http://www.ibm.com/developerworks/library/os-debug/

458 Eljakim Jul 05 2011 at 02:46

Lo siguiente habilita todos los errores:

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

También vea 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
176 m4dm4x1337 Aug 13 2013 at 18:59

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.

61 Tomalak May 10 2009 at 16:54

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.

61 JamesAnderson Sep 25 2009 at 11:22

Los errores y las advertencias suelen aparecer en la configuración de php.ini ....\logs\php_error.logo en ....\logs\apache_error.logfunción de ella.

También los errores útiles a menudo se dirigen al navegador, pero como no son HTML válidos, no se muestran.

Entonces, "tail -f"sus archivos de registro y cuando tenga una pantalla en blanco, use las opciones de menú" ver "->" fuente "de los IE para ver la salida sin procesar.

55 Madara'sGhost Feb 03 2014 at 03:47

Configuración PHP

2 entradas en php.ini dictan la salida de errores:

  1. display_errors
  2. error_reporting

En producción , display_errorsgeneralmente se establece en Off(¡Lo cual es bueno, porque la visualización de errores en los sitios de producción generalmente no es deseable!).

Sin embargo, en desarrollo , debe configurarse en On, para que se muestren los errores. ¡ Compruebe !

error_reporting(a partir de PHP 5.3) se establece de forma predeterminada en E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(lo que significa que todo se muestra excepto avisos, normas estrictas y avisos de obsolescencia). En caso de duda, configúrelo en E_ALLpara mostrar todos los errores. ¡ Compruebe !

¡Whoa Whoa! ¡Sin verificación! ¡No puedo cambiar mi php.ini!

Es una pena. Por lo general, los hosts compartidos no permiten la alteración de su archivo php.ini, por lo que lamentablemente esa opción no está disponible. ¡Pero no temas! ¡Tenemos otras opciones !

Configuración en tiempo de ejecución

En el script deseado, podemos modificar las entradas de php.ini en tiempo de ejecución. Es decir, se ejecutará cuando se ejecute el script. ¡Dulce!

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

¡Estas dos líneas harán el mismo efecto que alterar las entradas de php.ini como arriba! ¡Increíble!

¡Sigo recibiendo una página en blanco / error 500!

¡Eso significa que el script ni siquiera se había ejecutado! ¡Eso suele suceder cuando tienes un error de sintaxis!

Con errores de sintaxis, el script ni siquiera llega al tiempo de ejecución. Falla en el momento de la compilación , lo que significa que usará los valores en php.ini, que si no ha cambiado, puede que no permita la visualización de errores.

Registros de errores

Además, PHP registra errores por defecto. En el alojamiento compartido, puede estar en una carpeta dedicada o en la misma carpeta que el script infractor.

Si tiene acceso a php.ini, puede encontrarlo debajo de la error_logentrada.

31 FDisk Sep 25 2009 at 14:48

Siempre estoy usando esta sintaxis en la parte superior del script php.

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off
30 gnarf May 10 2009 at 16:59

Existe una extensión realmente útil llamada " xdebug " que también hará que sus informes sean mucho más agradables.

27 hakre Jan 24 2013 at 22:06

Para una solución de problemas rápida y práctica, normalmente sugiero aquí en SO:

error_reporting(~0); ini_set('display_errors', 1);

que debe colocarse al principio del guión que se encuentra en proceso de resolución de problemas. Esto no es perfecto, la variante perfecta es que también habilite eso en php.iniy que registre los errores en PHP para detectar errores de sintaxis y de inicio.

La configuración descrita aquí muestra todos los errores, avisos y advertencias, incluidos los estrictos, independientemente de la versión de PHP.

Próximos aspectos a considerar:

  • Instale Xdebug y habilite la depuración remota con su IDE.

Ver también:

  • Informe de errores (PHP de la manera correcta)
  • Documentos de constantes predefinidas
  • error_reporting()Docs
  • display_errorsDocs
27 EduardoOliveira Jan 06 2016 at 01:59

Es posible registrar un gancho para hacer visible el último error o advertencia.

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

agregar este código al comienzo de su index.php lo ayudará a depurar los problemas.

17 RichBradshaw Jul 05 2011 at 02:49

Si eres super cool, puedes intentar:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

Esto solo mostrará errores cuando esté ejecutando localmente. También le da la variable test_server para usar en otros lugares donde sea apropiado.

Cualquier error que ocurra antes de que se ejecute el script no será detectado, pero para el 99% de los errores que cometo, eso no es un problema.

17 Kld May 06 2013 at 21:14

En la parte superior de la página, elija un parámetro

error_reporting(E_ERROR | E_WARNING | E_PARSE);
17 Sherif Nov 12 2015 at 13:24

Este es un problema de configuración cargada frente a configuración en tiempo de ejecución

Es importante reconocer que se produce un error de sintaxis o un error de análisis durante el paso de compilación o análisis , lo que significa que PHP se recuperará incluso antes de que haya tenido la oportunidad de ejecutar su código. Entonces, si está modificando la display_errorsconfiguración de PHP durante el tiempo de ejecución (esto incluye cualquier cosa, desde usar ini_seten su código hasta usar .htaccess, que es un archivo de configuración de tiempo de ejecución), entonces solo los ajustes de configuración cargados por defecto están en juego.

Cómo evitar siempre WSOD en desarrollo

Para evitar una WSOD desea asegurarse de que su archivo de configuración cargada tiene display_errorsencendido y error_reportinglisto para -1( este es el E_ALL equivalente, ya que garantiza que todos los bits están activados independientemente de la versión de PHP que se está ejecutando ). No codifique el valor constante de E_ALL, porque ese valor está sujeto a cambios entre diferentes versiones de PHP.

Configuración cargado deberá ser cargada a su php.iniarchivo o su apache.confo httpd.confo archivo de host virtual. Esos archivos solo se leen una vez durante la etapa de inicio (cuando inicia por primera vez Apache httpd o php-fpm, por ejemplo) y solo se anulan mediante cambios de configuración en tiempo de ejecución. Asegurarse de eso display_errors = 1y error_reporting = -1en su archivo de configuración cargado asegura que nunca verá un WSOD independientemente de la sintaxis o el error de análisis que ocurra antes de un cambio de tiempo de ejecución como ini_set('display_errors', 1);o error_reporting(E_ALL);pueda tener lugar.

Cómo encontrar sus archivos de configuración cargados (php.ini)

Para ubicar sus archivos de configuración cargados, simplemente cree un nuevo archivo PHP con solo el siguiente código ...

<?php
phpinfo();

Luego, apunte su navegador allí y observe el archivo de configuración cargado y los archivos .ini adicionales analizados , que generalmente se encuentran en la parte superior phpinfo()e incluirán la ruta absoluta a todos sus archivos de configuración cargados.

Si ve en (none)lugar del archivo, significa que no tiene un php.ini en la ruta del archivo de configuración (php.ini) . Por lo tanto, puede descargar el archivo php.ini incluido con PHP desde aquí y copiarlo en la ruta del archivo de configuración como php.ini y luego asegurarse de que su usuario php tenga permisos suficientes para leer ese archivo. Deberá reiniciar httpd o php-fpm para cargarlo. Recuerde, este es el archivo php.ini de desarrollo que viene incluido con la fuente PHP. ¡Así que no lo use en producción!


Simplemente no hagas esto en producción

Esta es realmente la mejor manera de evitar un WSOD en desarrollo. Cualquiera que sugiera que coloque ini_set('display_errors', 1);o error_reporting(E_ALL);en la parte superior de su script PHP o use .htaccess como lo hizo aquí, no lo ayudará a evitar un WSOD cuando se produzca un error de sintaxis o análisis (como en su caso aquí) si su archivo de configuración cargado se ha display_errorsapagado.

Mucha gente (y las instalaciones de stock de PHP) utilizarán un archivo de producción-ini que se ha display_errorsdesactivado de forma predeterminada, lo que normalmente resulta en la misma frustración que ha experimentado aquí. Debido a que PHP ya lo tiene apagado cuando se inicia, luego encuentra un error de sintaxis o análisis y se rescata sin nada que generar. Espera que ini_set('display_errors',1);en la parte superior de su script PHP debería haber evitado eso, pero no importará si PHP no puede analizar su código porque nunca habrá alcanzado el tiempo de ejecución.

16 Ram Jul 05 2011 at 02:54

Para mantener esto y hacerlo cómodo, puede editar su archivo php.ini. Por lo general, se almacena en /etc/php.inio /etc/php/php.ini, pero los más locales php.inipueden sobrescribirlo, según las pautas de configuración de su proveedor de alojamiento. Busque un phpinfo()archivo Loaded Configuration Fileen la parte superior para asegurarse de cuál se carga en último lugar.

Busque display_errors en ese archivo. Debe haber solo 3 casos, de los cuales 2 están comentados.

Cambie la línea sin comentar a:

display_errors = stdout
16 Eli Sep 25 2009 at 15:09

No sé si ayudará, pero aquí hay una parte de mi archivo de configuración estándar para proyectos php. Tiendo a no depender demasiado de las configuraciones de Apache incluso en mi propio servidor.

Nunca tengo el problema de la desaparición del error, así que quizás algo aquí te dé una idea.

Editado para mostrar APPLICATON_LIVE

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( "display_errors", "1");
    ini_set ( "display_startup_errors", "1");
    ini_set ( "html_errors", "1");
    ini_set ( "docref_root", "http://www.php.net/");
    ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
    ini_set ( "error_append_string", "</div>");
}
15 Yan.Zero Aug 19 2014 at 22:36
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Además, puede obtener información más detallada con xdebug .

15 OndřejŠotek Jul 16 2015 at 05:38

Recomiendo Nette Tracy para una mejor visualización de errores y excepciones en PHP:

15 AbuzerFirdousi Dec 05 2017 at 03:54
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
10 ÓlafurWaage May 10 2009 at 16:54
error_reporting(E_ALL | E_STRICT);

Y active los errores de visualización en php.ini

9 soulmerge May 10 2009 at 16:54

Puede registrar su propio controlador de errores en PHP. Volcar todos los errores en un archivo puede ayudarlo en estos casos oscuros, por ejemplo. Tenga en cuenta que se llamará a su función, sin importar en qué esté configurado su error_reporting actual . Ejemplo muy básico:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');
7 CodeSynthesis Jun 10 2014 at 20:37

Las dos líneas clave que necesita para obtener errores útiles de PHP son:

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

Como señalaron otros colaboradores, estos están desactivados de forma predeterminada por razones de seguridad. Como consejo útil: cuando está configurando su sitio, es útil hacer un cambio para sus diferentes entornos para que estos errores estén ACTIVADOS de forma predeterminada en sus entornos locales y de desarrollo. Esto se puede lograr con el siguiente código (idealmente en su archivo index.php o config para que esté activo desde el principio):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}
6 RichBradshaw May 10 2009 at 17:21

FirePHP también puede ser útil.

6 user577803 Jan 17 2011 at 03:59

abra su php.ini, asegúrese de que esté configurado para:

display_errors = On

reinicia tu servidor.

6 user1681048 Jun 18 2014 at 08:03

Es posible que también desee probar PHPStorm como su editor de código. Encontrará muchos PHP y otros errores de sintaxis justo cuando escribe en el editor.

6 AshutoshJha Nov 10 2014 at 18:23

si eres un usuario de ubuntu, ve a tu terminal y ejecuta este comando

sudo tail -50f /var/log/apache2/error.log

donde mostrará 50 errores recientes. Hay un archivo de error error.logpara apache2 que registra todos los errores.

5 DanielSorichetti May 10 2009 at 19:09

Para activar el informe completo de errores, agregue esto a su secuencia de comandos:

error_reporting(E_ALL);

Esto hace que aparezcan incluso advertencias mínimas. Y, por si acaso:

ini_set('display_errors', '1');

Forzará la visualización de errores. Esto debe desactivarse en los servidores de producción, pero no durante el desarrollo.

5 Noname Feb 01 2014 at 13:24

Los “ERRORES” son las cosas más útiles para que los desarrolladores conozcan sus errores y los resuelvan para que el sistema funcione a la perfección.

PHP proporciona algunas de las mejores formas de saber a los desarrolladores por qué y dónde su código está recibiendo los errores, por lo que al conocer esos errores, los desarrolladores pueden mejorar su código de muchas maneras.

Las mejores formas de escribir siguiendo dos líneas en la parte superior del script para obtener todos los mensajes de error:

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

Otra forma de utilizar herramientas de depuración como xdebug en su IDE.

4 AymanHourieh May 10 2009 at 16:58

Puede habilitar el informe completo de errores (incluidos avisos y mensajes estrictos). Algunas personas encuentran esto demasiado detallado, pero vale la pena intentarlo. Establecer error_reportinga E_ALL | E_STRICTen su php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT le notificará sobre funciones obsoletas y le dará recomendaciones sobre los mejores métodos para realizar determinadas tareas.

Si no desea recibir avisos, pero encuentra otros tipos de mensajes útiles, intente excluir los avisos:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

También asegúrese de que display_errorsesté habilitado en php.ini. Si su versión de PHP es anterior a 5.2.4, configúrela en On:

display_errors = "On"

Si su versión es 5.2.4 o más reciente, use:

display_errors = "stderr"
4 jmucchiello May 11 2009 at 01:16

Aparte de error_reporting y la configuración ini display_errors, puede obtener errores SYNTAX de los archivos de registro de su servidor web. Cuando estoy desarrollando PHP, cargo los registros del servidor web de mi sistema de desarrollo en mi editor. Siempre que pruebo una página y aparece una pantalla en blanco, el archivo de registro se vuelve obsoleto y mi editor pregunta si quiero volver a cargarlo. Cuando lo hago, salto al final y aparece el error de sintaxis. Por ejemplo:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9
3 AVKurov Jul 05 2017 at 16:04

Para aquellos que usan nginx y tienen una pantalla en blanco incluso para archivos con <?php echo 123;. En mi caso, no tenía esta opción requerida para PHP en el archivo de configuración nginx:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Esta opción no estaba en el archivo fastcgi_params, por lo que PHP no funcionó y no hubo errores en los registros.