¿Cómo puedo obtener mensajes de error útiles en PHP?
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
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_reporting
y display_errors
. display_errors
es 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_reporting
obtener 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/
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
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.
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.
Los errores y las advertencias suelen aparecer en la configuración de php.ini ....\logs\php_error.log
o en ....\logs\apache_error.log
funció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.
Configuración PHP
2 entradas en php.ini dictan la salida de errores:
- display_errors
- error_reporting
En producción , display_errors
generalmente 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_ALL
para 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.
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
Existe una extensión realmente útil llamada " xdebug " que también hará que sus informes sean mucho más agradables.
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.ini
y 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
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.
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.
En la parte superior de la página, elija un parámetro
error_reporting(E_ERROR | E_WARNING | E_PARSE);
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_errors
configuración de PHP durante el tiempo de ejecución (esto incluye cualquier cosa, desde usar ini_set
en 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_errors
encendido y error_reporting
listo 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.ini
archivo o su apache.conf
o httpd.conf
o 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 = 1
y error_reporting = -1
en 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_errors
apagado.
Mucha gente (y las instalaciones de stock de PHP) utilizarán un archivo de producción-ini que se ha display_errors
desactivado 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.
Para mantener esto y hacerlo cómodo, puede editar su archivo php.ini. Por lo general, se almacena en /etc/php.ini
o /etc/php/php.ini
, pero los más locales php.ini
pueden sobrescribirlo, según las pautas de configuración de su proveedor de alojamiento. Busque un phpinfo()
archivo Loaded Configuration File
en 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
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>");
}
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 .
Recomiendo Nette Tracy para una mejor visualización de errores y excepciones en PHP:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
error_reporting(E_ALL | E_STRICT);
Y active los errores de visualización en php.ini
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');
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;
}
FirePHP también puede ser útil.
abra su php.ini, asegúrese de que esté configurado para:
display_errors = On
reinicia tu servidor.
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.
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.log
para apache2 que registra todos los errores.
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.
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.
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_reporting
a E_ALL | E_STRICT
en 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_errors
esté 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"
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
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.