Resolver problemas

Registar erros do PHP para um ficheiro concreto

Revisto a 2 min de leitura depuração PHP

Em aplicações em produção, a apresentação de erros deve permanecer desativada para não revelar caminhos, consultas nem outros dados internos aos visitantes.

Faça a depuração de preferência num ambiente de staging que reproduza o problema. Se, excecionalmente, tiver de diagnosticar um ficheiro em produção e o PHP chegar a executá-lo, mantenha display_errors desativado e envie os erros para um registo privado fora de public_html:

error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/home/CPANEL_USUARIO/logs/php-debug.log');

error_reporting define os erros que serão registados e E_ALL aplica o nível máximo.

Estas diretivas aplicam-se durante a execução. Não conseguem registar um erro de sintaxe ou de compilação do mesmo ficheiro se esse erro impedir que o PHP chegue a executá-las. Nesse caso, ative primeiro o registo para a versão efetiva do PHP a partir do cPanel ou utilize um ficheiro auxiliar válido que aplique estas diretivas e depois inclua o ficheiro que quer verificar.

Antes de testar, crie o diretório fora da raiz web e proteja o ficheiro com permissões 0600. Limite a captura ao tempo indispensável e evite registar dados sensíveis.

Ao terminar, elimine estas linhas do ficheiro, verifique que display_errors continua desativado e apague o registo quando já não for necessário para o diagnóstico.

Alcance real destas linhas

Mesmo que as coloque num ficheiro concreto, as definições afetam o resto dessa execução PHP, incluindo ficheiros carregados depois; não filtram o registo para que apareçam apenas erros desse ficheiro. Se precisar de delimitar o teste, utilize um pedido controlado e filtre as suas entradas por hora e caminho.

Acrescente o código numa posição válida do PHP: uma declaração declare(strict_types=1) ou um namespace pode ter requisitos de posição. Não anteponha instruções automaticamente a qualquer ficheiro. Valide a sintaxe com a mesma versão do PHP antes de reproduzir o erro.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.