¿Cómo consigo que se muestren los errores de PHP?
Frecuentes
Visto 3,083 veces
1817
He comprobado mi archivo PHP ini (php.ini
) y display_errors
está configurado y también se informa de errores E_ALL
. He reiniciado mi servidor web Apache.
Incluso he puesto estas líneas en la parte superior de mi secuencia de comandos y ni siquiera detecta errores de análisis simples. Por ejemplo, declaro variables con un "$"
y no cierro declaraciones";"
. Pero todos mis scripts muestran una página en blanco sobre estos errores, pero realmente quiero ver el errores en la salida de mi navegador.
error_reporting(E_ALL);
ini_set('display_errors', 1);
¿Que más queda por hacer?
28 Respuestas
3329
Esto siempre funciona para mí:
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
Sin embargo, esto no hace que PHP muestre errores de análisis; la única forma de mostrar esos errores es modificar su php.ini con esta línea:
display_errors = on
(si no tiene acceso a php.ini
, luego poner esta línea en .htaccess
podría funcionar también):
php_flag display_errors 1
contestado el 14 de mayo de 20 a las 01:05
También tenga en cuenta que puede usar estas 3 líneas y luego incluir ('fileImWorkingOn.php') ;. ¡Entonces también puede detectar los errores de sintaxis! - chasquido
Si bien no soy SysOps, creo que más personas tienen un archivo .htaccess que php.ini, y ambos vendrían antes del análisis, ¿verdad? php_flag display_errors 1
para .htaccess - Ryan Taylor
Entonces, ahora que se registran los errores, ¿a dónde van? Fui a / var / log / apache2 y muestra todos los registros, pero no hay información sobre el programa que ejecuté recientemente. Solo obtengo información sobre los reinicios del sistema una vez cada mañana. - Michael
@Michael Los errores van directamente a la pantalla o a donde se redirige la salida - Juan de lujo
E_ALL
no es suficiente para mostrar todos errores en PHP 5.3. "E_STRICT
se convirtió en parte de E_ALL
en 5.4.0 "- Manual de PHP Necesita E_ALL | E_STRICT
or -1
en esa versión. - Gerardo Roche
157
No puede detectar errores de análisis cuando habilita la salida de error en tiempo de ejecución, porque analiza el archivo antes de ejecutar nada (y dado que encuentra un error durante esto, no ejecutará nada). Deberá cambiar la configuración real del servidor para que display_errors esté activado y se use el nivel de error_reporting apropiado. Si no tiene acceso a php.ini, es posible que pueda usar .htaccess o similar, según el servidor.
Esta pregunta puede proporcionar información adicional.
contestado el 23 de mayo de 17 a las 13:05
147
Dentro de su php.ini:
display_errors = on
Luego reinicie su servidor web.
Respondido el 08 de enero de 13 a las 09:01
+ ①. En mi ubuntu /etc/php5/apache2/php.ini - m93a
es reanudar (Debian, Ubuntu, etc) sudo service apache2 restart
- pedro krauss
Para reiniciar en OS X sudo apachectl -k restart
. - Guisante
Dato curioso: puedes localizar tu archivo php.ini cargado si simplemente pones phpinfo (); en un archivo php en blanco. es la séptima fila hacia abajo y se llama Loaded Configuration File
- menta
100
Para mostrar todos los errores, debe:
1. Tenga estas líneas en el script PHP que está llamando desde el navegador (normalmente index.php
):
error_reporting(E_ALL);
ini_set('display_errors', '1');
2. (a) Asegúrese de que este script no tenga errores de sintaxis
-o-
2. (b) Establecer display_errors = On
en tu php.ini
De lo contrario, ¡ni siquiera puede ejecutar esas 2 líneas!
Puede verificar si hay errores de sintaxis en su script ejecutando (en la línea de comando):
php -l index.php
Si incluir el script de otro script PHP y luego seguirá mostrar errores de sintaxis en el incluido texto. Por ejemplo:
index.php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Any syntax errors here will result in a blank screen in the browser
include 'my_script.php';
my_script.php
adjfkj // This syntax error will be displayed in the browser
Respondido 08 Oct 18, 15:10
53
Algunos proveedores de alojamiento web le permiten cambiar los parámetros de PHP en el .htaccess
archivo.
Puede agregar la siguiente línea:
php_value display_errors 1
Tuve el mismo problema que el tuyo y esta solución lo solucionó.
Respondido 17 Feb 19, 09:02
Y si se encuentra en un entorno nginx, agregue el valor php a la configuración de su sitio (sitios disponibles) bajo la directiva location ~ \ .php. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;"; - Lázaro Kosmidis
41
Puede encontrar que todas las configuraciones para "informes de errores" o "errores de visualización" no parecen funcionar en PHP 7. Esto se debe a que el manejo de errores ha cambiado. Prueba esto en su lugar:
try{
// Your code
}
catch(Error $e) {
$trace = $e->getTrace();
echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
O, para detectar excepciones y errores de una sola vez (esto no es compatible con PHP 5):
try{
// Your code
}
catch(Throwable $e) {
$trace = $e->getTrace();
echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
Respondido el 06 de junio de 17 a las 19:06
¿Te refieres a PHP7 o PHP7.1? Estoy confundido, intenté como la respuesta validada propuesta y funciona, creo que está proponiendo algo un poco diferente en mi humilde opinión, de hecho, "sin compatibilidad con versiones anteriores" y si tiene que modificar un código PHP <7 completo y necesita agregar try{} catch() {}
código en todas partes en su código php ya definido, ni siquiera quiero pensar en el lío que va a ser .. - vdegenne
@FancyJohn, esto podría ayudar: $bt = debug_backtrace(); print_r($bt);
. - franco fuerte
@ballangddang, me encontré con el problema con PHP 7.0, donde la única forma en que podía mostrar el error era usando los bloques try / catch y capturando específicamente Error
. Si reescribe todas las solicitudes (excepto quizás JavaScript, CSS, imágenes, etc.) en el archivo index.php, entonces tenga el bloque try catch allí, lo hace más fácil. Sí, cualquier sistema que no tenga un solo punto de entrada sería un gran dolor de cabeza para actualizar. - franco fuerte
¿PHP no muestra excepciones no controladas? ¿Estás bastante seguro de que sí? - Martín Tournoij
Debería mostrar excepciones no controladas. Si enciende un búfer de salida al principio (para que pueda enviar encabezados en cualquier punto antes de vaciar finalmente el cuerpo de la respuesta), tal vez el mensaje de excepción pueda perderse en alguna parte. - franco fuerte
34
Así funciona:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
Respondido el 27 de diciembre de 16 a las 15:12
Octubre de 2020: esto funcionó para mí. Tan fácil. No te metas con .htaccess o php.ini. Cuando haya terminado, simplemente coméntelo o elimínelo. PHP 7.4 - Rob Moll
33
Uso:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Esta es la mejor manera de escribirlo, pero un error de sintaxis da una salida en blanco, así que use la consola para verificar si hay errores de sintaxis. La mejor forma de depurar código PHP es utilizar la consola; ejecutar lo siguiente:
php -l phpfilename.php
Respondido el 27 de diciembre de 16 a las 15:12
22
Pon esto en tu index.php archivo:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Respondido 17 Feb 19, 09:02
20
Crea un archivo llamado php.ini en la carpeta donde reside su archivo PHP.
Dentro de php.ini agregue el siguiente código (estoy dando un error simple que muestra el código):
display_errors = on
display_startup_errors = on
Respondido el 27 de diciembre de 16 a las 15:12
16
Como ahora estamos ejecutando PHP 7, las respuestas dadas aquí ya no son correctas. El único que todavía está bien es el de Frank Forte, ya que habla de PHP 7.
Por otro lado, en lugar de intentar detectar errores con un try / catch, puede usar un truco: use include.
Aquí tres piezas de código:
Archivo: tst1.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
// Missing " and ;
echo "Testing
?>
Ejecutar esto en PHP 7 no mostrará nada.
Ahora, intente esto:
Archivo: tst2.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
include ("tst3.php");
?>
Archivo: tst3.php
<?php
// Missing " and ;
echo "Testing
?>
Ahora ejecute tst2, que establece el informe de errores, y luego incluya tst3. Ya verás:
Error de análisis: error de sintaxis, final inesperado del archivo, esperando variable (T_VARIABLE) o $ {(T_DOLLAR_OPEN_CURLY_BRACES) o {$ (T_CURLY_OPEN) en tst3.php en la línea 4
Respondido 17 Feb 19, 09:02
15
Si, a pesar de seguir todas las respuestas anteriores (o no puede editar su archivo php.ini), aún no puede recibir un mensaje de error, intente crear un nuevo archivo PHP que habilite el informe de errores y luego incluya el archivo del problema. p.ej:
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');
A pesar de tener todo configurado correctamente en mi php.ini
file, esta era la única forma en que podía detectar un error de espacio de nombres. Mi escenario exacto fue:
//file1.php
namespace a\b;
class x {
...
}
//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
...
}
Respondido 18 Jul 18, 03:07
No, el informe de errores no es un nivel de registro, es un campo de bits. El uso de 999999 es una muy mala idea, use alguna potencia de dos menos 1, por ejemplo, ¡2047! - peterh - Reincorporar a Monica
¡Tienes toda la razón, @peterh! Lo cambié a E_ALL ya que esto permitirá informar de todos los errores (excepto los errores estrictos en php 5.4 y siguientes). - jxmallett
15
Por lo general, usaría el siguiente código en mis proyectos PHP simples.
if(!defined('ENVIRONMENT')){
define('ENVIRONMENT', 'DEVELOPMENT');
}
$base_url = null;
if (defined('ENVIRONMENT'))
{
switch (ENVIRONMENT)
{
case 'DEVELOPMENT':
$base_url = 'http://localhost/product/';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL|E_STRICT);
break;
case 'PRODUCTION':
$base_url = 'Production URL'; /* https://google.com */
error_reporting(0);
/* Mechanism to log errors */
break;
default:
exit('The application environment is not set correctly.');
}
}
Respondido el 13 de Septiembre de 19 a las 10:09
14
Si de alguna manera se encuentra en una situación en la que no puede modificar la configuración a través de php.ini
or .htaccess
no tiene suerte para mostrar errores cuando sus scripts PHP contienen errores de análisis. Entonces tendrías que resolver linting los archivos en la línea de comando Me gusta esto:
find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"
Si su host está tan bloqueado que no permite cambiar el valor mediante php.ini
or .htaccess
, también puede no permitir cambiar el valor a través de ini_set
. Puede comprobarlo con el siguiente script PHP:
<?php
if( !ini_set( 'display_errors', 1 ) ) {
echo "display_errors cannot be set.";
} else {
echo "changing display_errors via script is possible.";
}
Respondido el 11 de enero de 16 a las 12:01
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'
es más simple - scones
13
Puedes hacer algo como a continuación:
Establezca los siguientes parámetros en su archivo de índice principal:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
Luego, según sus requisitos, puede elegir cuál desea mostrar:
Para todos errores, advertencias y avisos:
error_reporting(E_ALL); OR error_reporting(-1);
Para todos errores:
error_reporting(E_ERROR);
Para todos advertencias:
error_reporting(E_WARNING);
Para todos avisos:
error_reporting(E_NOTICE);
Para más información, verifique aquí.
Respondido 17 Feb 19, 09:02
¿Qué es "archivo de índice principal"? Archivo index.html
? - Pedro Mortensen
12
Puede agregar su propio controlador de errores personalizado, que puede proporcionar información de depuración adicional. Además, puede configurarlo para que le envíe la información por correo electrónico.
function ERR_HANDLER($errno, $errstr, $errfile, $errline){
$msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
<b>File:</b> $errfile <br>
<b>Line:</b> $errline <br>
<pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";
echo $msg;
return false;
}
function EXC_HANDLER($exception){
ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}
function shutDownFunction() {
$error = error_get_last();
if ($error["type"] == 1) {
ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
}
}
set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");
Respondido 17 Feb 19, 09:02
7
Este código en la parte superior debería funcionar:
error_reporting(E_ALL);
Sin embargo, intente editar el código del teléfono en el archivo:
error_reporting =on
Respondido 17 Feb 19, 09:02
6
La mejor, fácil y rápida solución que puede usar si se trata de una depuración rápida, es rodear su código con excepciones de captura. Eso es lo que hago cuando quiero comprobar algo rápido en producción.
try {
// Page code
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
Respondido 17 Feb 19, 09:02
Para php7, catch (Throwable $e)
es mejor ... O otro bloque de captura debajo catch(Error $e)
- franco fuerte
5
<?php
// Turn off error reporting
error_reporting(0);
// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Report all errors
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?>
Mientras su sitio está activo, el php.ini
El archivo debería tener display_errors desactivado por razones de seguridad. Sin embargo, para el entorno de desarrollo, display_errors se puede habilitar para la resolución de problemas.
contestado el 29 de mayo de 19 a las 12:05
4
Solo escribe:
error_reporting(-1);
Respondido el 13 de enero de 17 a las 18:01
4
Puede hacer esto cambiando el archivo php.ini y agregando lo siguiente
display_errors = on
display_startup_errors = on
O también puede usar el siguiente código, ya que esto siempre me funciona
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Respondido el 28 de junio de 19 a las 09:06
3
Si tiene Xdebug instalado, puede anular todos los ajustes configurando:
xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;
force_display_errors
Escriba: int, Valor predeterminado: 0, Introducido en Xdebug> = 2.3 Si esta configuración se establece en 1, los errores siempre se mostrarán, sin importar cuál sea la configuración de display_errors de PHP.
force_error_reporting
Tipo: int, Valor predeterminado: 0, Introducido en Xdebug> = 2.3 Esta configuración es una máscara de bits, como error_reporting. A esta máscara de bits se le aplicará un OR lógico con la máscara de bits representada por error_reporting para determinar qué errores deben mostrarse. Esta configuración solo se puede realizar en php.ini y le permite forzar que se muestren ciertos errores sin importar lo que haga una aplicación con ini_set ().
Respondido 17 Feb 19, 09:02
3
Es posible que desee utilizar este código:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
respondido 28 mar '19, 14:03
2
Informar todos los errores excepto E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
Mostrar todos los errores de PHP
error_reporting(E_ALL); or ini_set('error_reporting', E_ALL);
Desactivar todos los informes de errores
error_reporting(0);
Respondido el 31 de diciembre de 19 a las 10:12
2
Si está en la línea de comando, puede ejecutar php
con -ddisplay_errors=1
para anular el ajuste en php.ini
:
php -ddisplay_errors=1 script.php
Respondido 22 Abr '20, 15:04
1
Puede mostrar el error de Php en su pantalla de forma sencilla. En primer lugar, simplemente coloque este código a continuación en su archivo php.ini.
display_errors = on;
(si no tiene acceso a php.ini, entonces poner esta línea en .htaccess también podría funcionar):
php_flag display_errors 1
O también puede usar el siguiente código en su archivo index.php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
respondido 06 nov., 20:06
1
En Unix CLI, es muy práctico redirigir solo errores en un archivo:
./script 2> errors.log
De su secuencia de comandos, use var_dump()
o equivalente como de costumbre (tanto STDOUT como STDERR recibirán la salida), pero escribir solo en el registro archivo:
fwrite(STDERR, "Debug infos\n"); // Write in errors.log^
Luego, desde otro shell, para cambios en vivo:
tail -f errors.log
o simplemente
watch cat errors.log
Respondido el 04 de diciembre de 20 a las 23:12
¿Cómo responde eso a esta pregunta sobre PHP? - Pedro Mortensen
./script
es un script PHP CLI (hashbang #!/usr/bin/php
). Puede redirigir los errores de php en un archivo de esta manera. Esta es la tubería Unix. Esto no es php como CGI. - NVRM
0
error_reporting(1);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
Pon esto en la parte superior de tu página.
Respondido 28 Feb 21, 00:02
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php error-handling syntax-error error-reporting or haz tu propia pregunta.
Todavía tengo que precisar exactamente por qué esto funciona a veces y no en otras, pero para cualquiera que desee cambiar rápidamente los errores en un script php (o habilitarlos a través de un
$_REQUEST
parámetro) estas dos líneas funcionarán la mayor parte del tiempo. - brandonscriptbueno, puede ver los detalles del error habilitando xdebug desde el archivo php ini. - jewelhuq
La mayoría de los editores / IDE específicos como, por ejemplo, Notepad ++, Eclipse tienen verificación de sintaxis incorporada y resaltado. Le mostrarán problemas como los descritos. No encienda la visualización de errores en un sistema en vivo. A los hackers les encantará esto, porque en la mayoría de los casos se muestran los caminos. Puede definir el controlador de errores / excepciones. En este controlador, puede registrar el problema y enviar un correo electrónico al desarrollador para que pueda solucionarlo de inmediato cuando se produzca un problema. ver php.net/manual/en/function.set-error-handler.php y php.net/manual/en/function.set-exception-handler.php - Alexander Behling