Mostrando erros no PHP
Erros são coisas que não queremos, mas se eles ocorrerem os queremos ver, principalmente durante o processo de desenvolvimento. É fato que ao desenvolver algo que não seja trivial estamos propensos a inserir erros no código, vê-los e corrigi-los faz parte do processo. Acontece que dependendo das configurações do servidor estes erros podem não serem mostrados, o que é uma coisa boa se o software estiver em produção, já que mensagens de erros podem fornecer informações importantes para possíveis atacantes. Então em alguns casos queremos habilitar a exibição de erros e em outros momentos queremos que eles não sejam exibidos.
No PHP temos duas configurações básicas que lidam com erros, display_errors
e display_errors
, que podem ser modificadas tanto dentro do php.ini
, chamando determinadas funções ou pelo arquivo .htaccess
.
Modo mais rápido de habilitar os erros no PHP
ini_set('display_errors', 1);
error_reporting(E_ALL);
Na primeira linha habilitamos o PHP para mostrar os erros(para desabilitar usamos o valor 0) , na segunda definimos o nível de erro que queremos reportar, no nosso caso todos.
Abaixo podemos conferir uma lista dos níveis de erro que PHP aceita e suas constantes:
Constante | Descrição |
---|---|
E_ALL | Todos erros e avisos são exibidos. |
E_ERROR | Erros fatais de tempo de execução. Eles indicam erros que não podem ser recuperados, como um problema de alocação de memória. A execução do script é interrompida. |
E_RECOVERABLE_ERROR | Erro fatal capturável. Indica que ocorreu um erro provavelmente perigoso, mas não deixou a Engine em um estado instável. Se o erro não for capturado por um handle definido pelo usuário, o aplicativo será interrompido como se fosse um E_ERROR . |
E_WARNING | Avisos em tempo de execução (erros não fatais). A execução do script não é interrompida. |
E_PARSE | Erros de parse em tempo de compilação. Os erros de parse devem ser gerados apenas pelo parser. |
E_NOTICE | Notificação de tempo de execução. Indica que o script encontrou algo que poderia indicar um erro, mas também poderia ocorrer no curso normal da execução de um script. |
E_STRICT | Habilita o PHP a sugerir alterações no código, o que garantirá a melhor interoperabilidade e a compatibilidade futura do seu código. |
E_CORE_ERROR | Erros fatais que ocorrem durante a inicialização inicial do PHP. É como um E_ERROR , exceto que é gerado pelo núcleo do PHP. |
E_CORE_WARNING | Avisos (erros não fatais) que ocorrem durante a inicialização inicial do PHP. É como um E_WARNING , exceto que é gerado pelo núcleo do PHP. |
E_COMPILE_ERROR | Erros fatais em tempo de compilação. É como um E_ERROR , exceto que é gerado pelo Zend Scripting Engine. |
E_COMPILE_WARNING | Avisos em tempo de compilação (erros não fatais). É como um E_WARNING , exceto que é gerado pelo Zend Scripting Engine. |
E_USER_ERROR | Mensagem de erro gerada pelo usuário. É como um E_ERROR , exceto que é gerado no código PHP usando a função PHP trigger_error() . |
E_USER_WARNING | Mensagem de aviso gerada pelo usuário. É como um E_WARNING , exceto que é gerado no código PHP usando a função PHP trigger_error() . |
E_USER_NOTICE | Mensagem de aviso gerado pelo usuário. É como um E_NOTICE , exceto que é gerado no código PHP usando a função PHP trigger_error() . |
E_DEPRECATED | Notificações em tempo de execução. Habilite isso para receber avisos sobre código que não funcionará em versões futuras. |
E_USER_DEPRECATED | Mensagem de notificação gerada pelo usuário. É como um E_DEPRECATED , exceto que é gerado no código PHP usando a função PHP trigger_error () . |
As constantes dos níveis de erro podem ser combinadas para melhor configurar os nível de erros a serem mostrado utilizando os operadores |
e &
para “juntar” dois níveis de erro e o ~
negar um. Configurações comuns são:
// Exibe todos os erros exceto notificações
E_ALL & ~E_NOTICE
//exibe todos os erros, exceto notificações e habilita sugerir alterações no código
E_ALL & ~E_NOTICE & ~E_STRICT
//Exibe somente erros
E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
Uma informação importante: as funções ini_set('display_errors', 1);
e error_reporting(E_ALL);
infelizmente não são capazes de exibir erros de parse(sintaxe), como falta de ponto e vírgula ou falta de chaves, para isso deve-se alterar as opções no php.ini
ou pelo .htaccess
.
Habilitando a exibição de erros no .htaccess
Quando temos acesso ao diretório de arquivos(o que é bem frequente 🙂 ) e o .htaccess
está habilitado podemos habilitar os erros por ele com a seguinte instrução.
php_flag display_errors on
php_value error_reporting -1
O display_errors
aceita os valores on
para habilitado e off
para desabilitado. O error_reporting
aceita valores inteiros para configurar o nível de error, utilizamos -1 para exibir todos os erros. Para outros níveis podemos utilizar os valores numérico das constantes que vimos na tabela e suas combinações. Para obter estes valores podemos simplesmente utilizar um echo (int) E_ALL & ~E_NOTICE & ~E_STRICT;
(retorna 30711) em algum script por exemplo.
Habilitando erros no php.ini
Este é o método que menos temos a nossa disposição, pois em muitas hospedagens não é possível alterar o arquivo php.ini
.
Para alterar basta abrir o arquivo php.ini
, no linux normalmente se encontra em /etc/php/<versao>/apache2/php.ini
e buscar a seguinte linha e alterá-la.
//de
display_errors = Off
// para
display_errors = On
Também podemos alterar o nível de erro do mesmo modo.
Habilitando log de erros no .htaccess
Em muitos casos, o mais interessante é não exibir na página os erros e sim que estes sejam exibido dentro de um arquivo de log, podemos habilitá-lo através do próprio .htaccess
:
php_flag log_errors on
php_value error_log log_erros.log
Na linha 1 habilitamos os erros a irem para um arquivo de log, na linha 2 especificamos o nome do arquivo ou caminho dele, sendo que não é muito aconselhável deixá-lo em uma pasta publica da sua hospedagem. Ou pelo menos bloquei o acesso dele via .htaccess
.
<Files log_erros.log>
Order allow,deny
Deny from all
Satisfy All
</Files>
Bom erra isso, t+, e que seus códigos tenham poucos erros 🙂