Como obtenho erros de PHP para exibir?

1731

Eu verifiquei meu arquivo ini do PHP ( php.ini) e display_errorsestá definido e também o relatório de erros E_ALL. Eu reiniciei meu servidor Apache.

Eu até coloquei essas linhas na parte superior do meu script, e ele nem captura erros simples de análise. Por exemplo, declaro variáveis ​​com a "$"e não fecho instruções ";". Mas todos os meus scripts mostram uma página em branco sobre esses erros, mas eu quero realmente ver os erros na saída do meu navegador.

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

O que resta fazer?

Abdômen
fonte
8
Eu ainda não entendi exatamente por que isso funciona algumas vezes e não outras, mas para quem deseja alternar rapidamente erros em um script php (ou ativá-los por meio de um $_REQUESTparâmetro), essas duas linhas funcionam na maioria das vezes.
brandonscript
bem, você pode ver detalhes do erro ativando o xdebug a partir do arquivo php ini.
Java19
Aqui está um artigo rápido que cobre o tópico - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Respostas:

3200

Isso sempre funciona para mim:

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

No entanto, isso não faz com que o PHP mostre erros de análise - a única maneira de mostrar esses erros é modificar o seu php.ini com esta linha:

display_errors = on

(se você não tiver acesso php.ini, inserir essa linha .htaccesstambém pode funcionar):

php_flag display_errors 1
John extravagante
fonte
9
Observe também que você pode usar essas 3 linhas e incluir ('fileImWorkingOn.php') ;. Então você pode pegar os erros de sintaxe também!
Snap
14
Enquanto eu não sou SysOps, acho que mais pessoas têm um arquivo .htaccess do que php.ini, e ambos viriam antes da análise, certo? php_flag display_errors 1para .htaccess
Ryan Taylor
1
Então agora que os erros são registrados, para onde eles vão? Fui para / var / log / apache2 e ele mostra todos os logs, mas não há informações sobre o programa que executei recentemente. Só recebo informações sobre o reinício do sistema uma vez todas as manhãs.
Michael
1
@ Michael Os erros ir direto para a tela ou para onde a saída é redirecionada para
Fantasia John
2
E_ALLnão é suficiente para exibir todos os erros no PHP 5.3. " E_STRICTtornou-se parte do E_ALL5.4.0" - Manual do PHP Você precisa E_ALL | E_STRICTou -1nessa versão.
Gerard Roche
155

Você não pode capturar erros de análise ao ativar a saída de erro em tempo de execução, porque ele analisa o arquivo antes de executar qualquer coisa (e, como encontra um erro durante isso, não executa nada). Você precisará alterar a configuração real do servidor para que display_errors esteja ativado e o nível apropriado de error_reporting seja usado. Se você não tiver acesso ao php.ini, poderá usar .htaccess ou similar, dependendo do servidor.

Esta pergunta pode fornecer informações adicionais.

Michael Madsen
fonte
2
Não sabia isso. Editei o arquivo php.ini manualmente e está funcionando agora. Obrigado!
Abs
143

Dentro do seu php.ini :

display_errors = on

Em seguida, reinicie o servidor da web.

user1803477
fonte
7
+ ①. No meu ubuntu /etc/php5/apache2/php.ini
m93a
5
para reinicialização (Debian, Ubuntu, etc.)sudo service apache2 restart
Peter Krauss
4
Para reiniciar no OS X sudo apachectl -k restart.
Pea
3
fato interessante: você pode localizar seu arquivo php.ini carregado se você simplesmente colocar em phpinfo (); em um arquivo php em branco. é a 7ª linha e chama #Loaded Configuration File
Frankenmint
Como podemos fazer se estamos escrevendo o código php diretamente no cPanel?
Arqam 29/08/16
98

Para exibir todos os erros, você precisa:

1. Tenha estas linhas no script PHP que você está chamando no navegador (normalmente index.php):

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

2. (a) Verifique se este script não possui erros de sintaxe

-ou-

2. (b) Coloque display_errors = Onem seuphp.ini

Caso contrário, ele não pode nem executar essas duas linhas!

Você pode verificar se há erros de sintaxe no seu script executando (na linha de comando):

php -l index.php

Se você incluir o script de outro script PHP em seguida, ele irá exibir erros de sintaxe no incluiu script. Por exemplo:

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
fonte
51

Alguns provedores de hospedagem permitem que você altere os parâmetros PHP no .htaccessarquivo.

Você pode adicionar a seguinte linha:

php_value display_errors 1

Eu tive o mesmo problema que o seu e esta solução o corrigiu.

Kalhua
fonte
E se você estiver no ambiente nginx, adicione o valor php à configuração do seu site (sites disponíveis) sob a diretiva location ~ \ .php. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis
40

Você pode encontrar todas as configurações de "relatório de erros" ou "erros de exibição" não parecem funcionar no PHP 7. Isso ocorre porque o tratamento de erros mudou. Tente isso:

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'];
}

Ou, para capturar exceções e erros de uma só vez (isso não é compatível com o 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
fonte
1
Você quer dizer PHP7 ou PHP7.1? Estou confuso, tentei como a resposta validada proposta e funciona, acho que você está propondo algo um pouco diferente do IMHO, na verdade "sem compatibilidade com versões anteriores" e se você precisar modificar um código PHP <7 completo e precisar adicionar try{} catch() {}código em todos os lugares em seu código PHP já definido, eu não quero nem pensar a bagunça que vai ser ..
vdegenne
@FancyJohn, isso poderia ajudar: $bt = debug_backtrace(); print_r($bt);.
27517 Frank Forte
@ballangddang, deparei-me com o PHP 7.0, onde a única maneira de exibir o erro era usando os blocos try / catch e especificamente capturando Error. Se você reescrever todas as solicitações (exceto, talvez, JavaScript, CSS, Imagens, etc.) no arquivo index.php, faça o bloco try catch lá, fica mais fácil. Sim, qualquer sistema que não possua um único ponto de entrada seria uma grande dor de cabeça para atualizar.
27417 Frank Forte
O PHP não mostra exceções não tratadas? Certeza de que sim?
Martin Tournoij 5/06
Deve mostrar exceções sem tratamento. Se você ativar um buffer de saída no início (para poder enviar cabeçalhos a qualquer momento antes de finalmente liberar o corpo da resposta), talvez a mensagem de exceção possa ser perdida em algum lugar.
19417 Frank Forte
33

Isso funcionará:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
Desenvolvedor-chefe
fonte
33

Usar:

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

Essa é a melhor maneira de escrevê-lo, mas um erro de sintaxe gera saída em branco; portanto, use o console para verificar se há erros de sintaxe. A melhor maneira de depurar o código PHP é usar o console; execute o seguinte:

php -l phpfilename.php
Abhijit Jagtap
fonte
22

Defina isso no seu arquivo index.php :

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

Crie um arquivo chamado php.ini na pasta em que seu arquivo PHP reside.

Dentro do php.ini, adicione o seguinte código (estou dando um erro simples ao mostrar o código):

display_errors = on

display_startup_errors = on
NavyaKumar
fonte
18

Aqui está um 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 uma explicação mais detalhada dos erros do PHP, visite PHP Error - error_reporting () .

B.Balamanigandan
fonte
2
Como isso é diferente da resposta de John Fancy ?
Todos os trabalhadores são essenciais
@cpburnz - São perguntas diretas, cada uma com o mesmo conjunto de códigos em seu sabor que a única diferença. Forneci um link de URL adicional que fornecerá mais informações sobre o erro do PHP.
B.Balamanigandan
15

Se, apesar de seguir todas as respostas acima (ou não conseguir editar o arquivo php.ini), você ainda não conseguir receber uma mensagem de erro, tente criar um novo arquivo PHP que permita o relatório de erros e inclua o arquivo com problema. por exemplo:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

Apesar de ter tudo definido corretamente no meu php.iniarquivo, essa foi a única maneira de detectar um erro no namespace. Meu cenário exato foi:

//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
fonte
1
Não, o relatório de erros não é um nível de log, é um campo de bits. Usar 999999 é uma péssima idéia, use uma potência de dois menos 1, por exemplo 2047!
peterh - Reinstala Monica
Você está absolutamente certo, @peterh! Eu mudei para E_ALL, pois isso permitirá relatar todos os erros (exceto erros estritos no php 5.4 e abaixo).
Jxmallett
15

Normalmente, eu usaria o seguinte código nos meus projetos 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
fonte
15

Ao usar o PHP como um módulo Apache, podemos alterar as definições de configuração usando diretivas nos arquivos de configuração do Apache (por exemplo, httpd.conf) e nos arquivos .htaccess. Você precisará dos privilégios “AllowOverride Options” ou “AllowOverride All” para fazer isso.

Verifique isto

http://funbird.co.uk/blog/tech-articals/linux-tech-articals/enabling-error-display-php-via-htaccess

Mike
fonte
O link está quebrado (404).
Peter Mortensen
14

Se você, de alguma forma, se encontra em uma situação em que não pode modificar a configuração php.iniou .htaccessnão tem sorte em exibir erros quando seus scripts PHP contêm erros de análise. Você precisaria então resolver os arquivos na linha de comando da seguinte maneira:

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

Se o seu host estiver tão bloqueado que não permita alterar o valor via php.iniou .htaccess, também poderá impedir a alteração do valor via ini_set. Você pode verificar isso com o seguinte 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
fonte
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'é mais simples
scones
14

Como agora estamos executando o PHP 7, as respostas fornecidas aqui não estão mais corretas. O único que ainda está bom é o de Frank Forte , enquanto ele fala sobre o PHP 7.

Por outro lado, em vez de tentar detectar erros com um try / catch, você pode usar um truque: use include.

Aqui estão três partes do código:

Arquivo: tst1.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    // Missing " and ;
    echo "Testing
?>

Executar isso no PHP 7 não mostrará nada.

Agora, tente o seguinte:

Arquivo: tst2.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    include ("tst3.php");
?>

Arquivo: tst3.php

<?php
    // Missing " and ;
    echo "Testing
?>

Agora execute tst2 que define o relatório de erros e inclua tst3. Você verá:

Erro de análise: erro de sintaxe, final inesperado do arquivo, variável esperada (T_VARIABLE) ou $ {(T_DOLLAR_OPEN_CURLY_BRACES) ou {$ (T_CURLY_OPEN) no tst3.php na linha 4

Pedro
fonte
13

Você pode fazer algo como abaixo:

Defina os parâmetros abaixo no seu arquivo de índice principal:

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

Então, com base nos seus requisitos, você pode escolher qual deseja mostrar:

Para todos os erros, avisos e avisos:

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

Para todos os erros:

    error_reporting(E_ERROR);

Para todos os avisos:

    error_reporting(E_WARNING);

Para todos os avisos:

    error_reporting(E_NOTICE);

Para mais informações, clique aqui .

Binit Ghetiya
fonte
O que é o "arquivo de índice principal" ? Ficheiro index.html?
Peter Mortensen
12

Você pode adicionar seu próprio manipulador de erros personalizado, que pode fornecer informações extras sobre depuração. Além disso, você pode configurá-lo para enviar as informações por e-mail.

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á
fonte
7

Este código na parte superior deve funcionar:

error_reporting(E_ALL);

No entanto, tente editar o código no telefone no arquivo:

error_reporting =on
Wembo Mulumba
fonte
6

A melhor solução / fácil / rápida que você pode usar se for uma depuração rápida é cercar seu código com exceções de captura. É o que estou fazendo quando quero verificar algo rapidamente na produção.

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
Xakiru
fonte
Para php7, catch (Throwable $e)é melhor ... Ou outra por baixo bloco catchcatch(Error $e)
Frank Forte
4

Apenas escreva:

error_reporting(-1);
jewelhuq
fonte
4

Foi o que eu aprendi. No arquivo PHP.INI,

error_reporting = E_ALL
display_errors = On
Salam
fonte
2
Mudando? Adicionando a?
Peter Mortensen
atm sua resposta não faz sentido porque está faltando contexto; também estipulado por Peter Mortensen. Não o aprimora, preparando-o para "sinalização para remoção" (por bots). (Da revisão de baixa qualidade).
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);
    ?>

Enquanto o site estiver ativo, o php.iniarquivo deverá ter display_errors desativado por motivos de segurança. No entanto, para o ambiente de desenvolvimento, display_errors pode ser ativado para solução de problemas.

pardeep
fonte
4

Você pode fazer isso alterando o arquivo php.ini e adicione o seguinte

display_errors = on
display_startup_errors = on

OU você também pode usar o código a seguir, pois isso sempre funciona para mim

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

Se você tiver o Xdebug instalado, poderá substituir todas as configurações, definindo:

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

force_display_errors

Tipo: int, Valor padrão: 0, Introduzido no Xdebug> = 2.3 Se essa configuração for definida como 1, os erros sempre serão exibidos, independentemente da configuração dos display_errors do PHP.

force_error_reporting

Tipo: int, Valor padrão: 0, Introduzido no Xdebug> = 2.3 Essa configuração é uma máscara de bits, como error_reporting. Esta máscara de bits será logicamente ORed com a máscara de bits representada por error_reporting para determinar quais erros devem ser exibidos. Esta configuração pode ser feita apenas no php.ini e permite que você force a exibição de certos erros, independentemente do que um aplicativo faça com ini_set ().

Peter Haberkorn
fonte
3

Você pode querer usar este código:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
baduker
fonte
2

Relatar todos os erros, exceto E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Exibir todos os erros do PHP

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

Desativar todos os relatórios de erros

error_reporting(0);
Shaikh Nadeem
fonte
1

Na CLI do Unix , é muito prático redirecionar apenas erros para um arquivo :

./script 2> errors.log

Em seguida, de outro shell, para alterações ao vivo:

tail -f errors.log

ou simplesmente

watch cat errors.log
NVRM
fonte
Como isso responde a essa pergunta sobre PHP?
Peter Mortensen
./scripté um script da CLI php (hashbang #!/usr/bin/php). Você pode redirecionar os erros de php em um arquivo dessa maneira. Esta é a tubulação unix. Este não é php como CGI.
NVRM 22/04
0

Se estiver na linha de comando, você pode executar phpcom -ddisplay_errors=1para substituir a configuração em php.ini:

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

Diferente do php.inie ini_set()funções em um script PHP, você pode fazer a mesma coisa com .htaccesse httpd.confdirectivas mostrado abaixo.

Alguns provedores de hospedagem permitem definir configurações do PHP através de .htaccesse httpd.conf.

Ocultar erros 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

encontrou esta resposta pesquisando um pouco

mohitesachin217
fonte