¿Cómo consigo que se muestren los errores de PHP?

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?

preguntado el 27 de junio de 09 a las 16:06

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. -

bueno, puede ver los detalles del error habilitando xdebug desde el archivo php ini. -

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 -

28 Respuestas

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

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

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

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

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

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

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

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

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

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

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

Pasé algún tiempo averiguando esto. ¿Por qué cambiaron el comportamiento de php 5? - Hebe

@Hebe - Muy buena pregunta .... - Peter

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

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

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

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

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

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

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

    <?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

Solo escribe:

error_reporting(-1);

Respondido el 13 de enero de 17 a las 18:01

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

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

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

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

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

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

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

     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 or haz tu propia pregunta.