¿Cómo obtengo errores PHP para mostrar?

1731

He comprobado mi archivo ini de PHP ( php.ini) y display_errorsestá configurado, y también lo está el informe de errores E_ALL. He reiniciado mi servidor web Apache.

Incluso he puesto estas líneas en la parte superior de mi script, y ni siquiera detecta errores simples de análisis. Por ejemplo, declaro variables con "$"ay no cierro declaraciones ";". Pero todos mis scripts muestran una página en blanco sobre estos errores, pero realmente quiero ver los errores en la salida de mi navegador.

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

¿Que más queda por hacer?

Abdominales
fuente
8
Todavía tengo que precisar exactamente por qué esto funciona a veces y no a otros, pero para cualquiera que quiera alternar rápidamente los errores en un script php (o habilitarlos a través de un $_REQUESTparámetro), estas dos líneas funcionarán la mayor parte del tiempo.
brandonscript
bueno, puedes ver detalles del error habilitando xdebug desde el archivo php ini.
jewelhuq
He aquí un artículo rápido que cubre el tema - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Respuestas:

3200

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 php.ini, entonces poner esta línea también .htaccesspodría funcionar):

php_flag display_errors 1
Elegante john
fuente
99
También tenga en cuenta que puede usar estas 3 líneas y luego incluir ('fileImWorkingOn.php') ;. ¡Entonces también puedes ver los errores de sintaxis!
Snap
14
Si bien no soy SysOps, creo que más personas tienen un archivo .htaccess que php.ini, y ambos vendrían antes de analizar, ¿verdad? php_flag display_errors 1for .htaccess
Ryan Taylor
1
Entonces, ahora que los errores se registran, ¿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 el reinicio del sistema una vez cada mañana.
Michael
1
@Michael Los errores van directamente a la pantalla oa donde se redirige la salida
Fancy John
2
E_ALLno es suficiente para mostrar todos los errores en PHP 5.3. "se E_STRICTconvirtió en parte de E_ALL5.4.0" - Manual PHP que necesita E_ALL | E_STRICTo -1en esa versión.
Gerard Roche
155

No puede detectar los errores de análisis al habilitar la salida de errores en tiempo de ejecución, porque analiza el archivo antes de ejecutar cualquier cosa (y dado que encuentra un error durante esto, no ejecutará nada). Tendrá que cambiar la configuración real del servidor para que display_errors esté activado y se use el nivel de informe de error apropiado. Si no tiene acceso a php.ini, puede usar .htaccess o similar, dependiendo del servidor.

Esta pregunta puede proporcionar información adicional.

Michael Madsen
fuente
2
No sabía eso. Edité el archivo php.ini manualmente y ahora funciona. ¡Gracias!
Abs
143

Dentro de tu php.ini :

display_errors = on

Luego reinicie su servidor web.

usuario1803477
fuente
77
+ ①. En mi ubuntu
/etc/php5/apache2/php.ini
55
para reiniciar (Debian, Ubuntu, etc.)sudo service apache2 restart
Peter Krauss
44
Para reiniciar en OS X sudo apachectl -k restart.
Guisante
3
Dato curioso: puede ubicar su archivo php.ini cargado si simplemente coloca phpinfo (); en un archivo php en blanco. es la séptima fila hacia abajo y llamóLoaded Configuration File
Frankenmint
¿Cómo podemos hacer si estamos escribiendo el código php directamente en el cPanel?
arqam
98

Para mostrar todos los errores necesita:

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 = Onen suphp.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 incluye el script de otro script PHP , mostrará errores de sintaxis en el script incluido . 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
andre
fuente
51

Algunos proveedores de alojamiento web le permiten cambiar los parámetros de PHP en el .htaccessarchivo.

Puede agregar la siguiente línea:

php_value display_errors 1

Tuve el mismo problema que el tuyo y esta solución lo solucionó.

Kalhua
fuente
Y si está en un entorno nginx, agregue el valor de php a la configuración de su sitio (sitios disponibles) en la directiva de ubicación ~ \ .php. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis
40

Puede encontrar que todas las configuraciones para "informe de errores" o "errores de visualización" no parecen funcionar en PHP 7. Esto se debe a que el manejo de errores ha cambiado. Intenta 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 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'];
}
Frank Forte
fuente
1
¿Te refieres a PHP7 o PHP7.1? Estoy confundido, intenté como la respuesta validada propuesta y funciona, creo que estás proponiendo algo un poco diferente en mi humilde opinión, de hecho "no hay compatibilidad con versiones anteriores" y si tienes que modificar un código PHP <7 completo y necesitas agregar try{} catch() {}código en todas partes en el código php ya definido, no quiero ni pensar en el lío que va a ser ..
vdegenne
@FancyJohn, esto podría ayudar a: $bt = debug_backtrace(); print_r($bt);.
Frank Forte
@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 específicamente atrapando Error. Si reescribe todas las solicitudes (excepto tal vez JavaScript, CSS, Imágenes, etc.) en el archivo index.php, entonces tiene 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.
Frank Forte
¿PHP no muestra excepciones no manejadas? ¿Estoy seguro de que sí?
Martin Tournoij
Debería mostrar excepciones no manejadas. Si enciende un búfer de salida al inicio (para que pueda enviar encabezados en cualquier punto antes de enjuagar finalmente el cuerpo de la respuesta) tal vez el mensaje de excepción se pueda perder en alguna parte.
Frank Forte
33

Esto funcionará:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
Desarrollador principal
fuente
33

Utilizar:

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 genera un resultado en blanco, por lo tanto, use la consola para verificar si hay errores de sintaxis. La mejor manera de depurar el código PHP es usar la consola; ejecuta lo siguiente:

php -l phpfilename.php
Abhijit Jagtap
fuente
22

Establezca esto en su archivo index.php :

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Sumit Gupta
fuente
20

Cree 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 simple error al mostrar el código):

display_errors = on

display_startup_errors = on
NavyaKumar
fuente
18

Aquí hay un script PHP:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

Para obtener una explicación más detallada de los errores de PHP, visite Error de PHP - error_reporting () .

B.Balamanigandan
fuente
2
¿Cómo es esto diferente de la respuesta de Fancy John ?
Todos los trabajadores son esenciales
@cpburnz: es una pregunta directa, cada uno tiene el mismo conjunto de códigos en su sabor que la única diferencia. Le di un enlace URL adicional que le dará más información sobre el error de PHP.
B.Balamanigandan
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 permita la notificación 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.iniarchivo, esta fue la única forma en que pude 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 {
    ...
}
jxmallett
fuente
1
No, el informe de errores no es un nivel de registro, es un campo de bits. Usar 999999 es una muy mala idea, ¡use algo de potencia de dos menos 1, por ejemplo 2047!
peterh - Restablece a Monica el
Tienes toda la razón, @peterh! Lo cambié a E_ALL ya que esto permitirá informar todos los errores (excepto los errores estrictos en php 5.4 y siguientes).
jxmallett
15

Por lo general, iría con 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.');
    }
}
Channaveer Hakari
fuente
14

Si de alguna manera te encuentras en una situación en la que no puedes modificar la configuración a través de php.inio .htaccessno tienes suerte para mostrar errores cuando tus scripts PHP contienen errores de análisis. Entonces tendría que resolver alinear los archivos en la línea de comando de esta manera:

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 a través de php.inio .htaccess, también puede no permitir cambiar el valor a través de ini_set. Puede verificar eso 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.";
}
chiborg
fuente
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'es más simple
bollos
14

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 , mientras habla sobre PHP 7.

Por otro lado, en lugar de intentar detectar errores con un intento / captura, 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, intenta 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, variable esperada (T_VARIABLE) o $ {(T_DOLLAR_OPEN_CURLY_BRACES) o {$ (T_CURLY_OPEN) en tst3.php en la línea 4

Peter
fuente
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 qué desea mostrar:

Para todos los errores, advertencias y avisos:

    error_reporting(E_ALL); OR error_reporting(-1);

Para todos los errores:

    error_reporting(E_ERROR);

Para todas las advertencias:

    error_reporting(E_WARNING);

Para todos los avisos:

    error_reporting(E_NOTICE);

Para más información, ver aquí .

Binit Ghetiya
fuente
¿Qué es el "archivo de índice principal" ? Archivo index.html?
Peter Mortensen
12

Puede agregar su propio controlador de errores personalizado, que puede proporcionar información adicional de depuración. Además, puede configurarlo para enviarle 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");
lintabá
fuente
7

Este código en la parte superior debería funcionar:

error_reporting(E_ALL);

Sin embargo, intente editar el código en el teléfono en el archivo:

error_reporting =on
Wembo Mulumba
fuente
6

La mejor / fácil / 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 estoy haciendo cuando quiero verificar algo rápido en la producción.

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
Xakiru
fuente
Para php7, catch (Throwable $e)es mejor ... u otro bloqueo debajocatch(Error $e)
Frank Forte
4

Solo escribe:

error_reporting(-1);
jewelhuq
fuente
4

Eso es lo que aprendí. En el archivo PHP.INI,

error_reporting = E_ALL
display_errors = On
Salam
fuente
2
Cambiando en? ¿Añadiendo a?
Peter Mortensen
atm su respuesta no tiene sentido porque carece de contexto; también estipulado por Peter Mortensen. No mejorarlo lo prepara para "marcar para eliminar" (por bots). (De la revisión de baja calidad).
ZF007
4
    <?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.iniarchivo debe tener display_errors deshabilitado por razones de seguridad. Sin embargo, para el entorno de desarrollo, display_errors se pueden habilitar para la resolución de problemas.

pardeep
fuente
4

Puede hacerlo 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 funciona para mí

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Muhammad Adeel Malik
fuente
3

Si tiene instalado Xdebug , puede anular cada configuración configurando:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

Tipo: int, Valor predeterminado: 0, Introducido en Xdebug> = 2.3 Si esta configuración se establece en 1, siempre se mostrarán los errores, 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. Esta máscara de bits se ordeará lógicamente 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 la visualización de ciertos errores sin importar lo que haga una aplicación con ini_set ().

Peter Haberkorn
fuente
3

Es posible que desee utilizar este código:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
baduker
fuente
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);

Desactiva todos los informes de errores

error_reporting(0);
Shaikh Nadeem
fuente
1

En Unix CLI , es muy práctico redirigir solo los errores a un archivo :

./script 2> errors.log

Luego, desde otro shell, para cambios en vivo:

tail -f errors.log

o simplemente

watch cat errors.log
NVRM
fuente
¿Cómo responde eso a esta pregunta sobre PHP?
Peter Mortensen
./scriptes 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 de Unix. Esto no es PHP como CGI.
NVRM
0

Si está en la línea de comando, puede ejecutar phpcon -ddisplay_errors=1para anular la configuración en php.ini:

php -ddisplay_errors=1 script.php
gvlasov
fuente
-1

Aparte de la php.iniy ini_set()las funciones en un script PHP, puede hacer esto mismo con .htaccessy httpd.confdirectivas se muestra a continuación.

Algunos proveedores de hosting permiten establecer configuraciones PHP a través de .htaccessy httpd.conf.

Ocultar errores de PHP

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

encontré esta respuesta buscando en Google un poco

mohitesachin217
fuente