Posso usar set_error_handler()
para capturar a maioria dos erros de PHP, mas não funciona para E_ERROR
erros fatais ( ), como chamar uma função que não existe. Existe outra maneira de capturar esses erros?
Estou tentando chamar mail()
todos os erros e estou executando o PHP 5.2.3.
php
fatal-error
muito php
fonte
fonte
Respostas:
register_shutdown_function
Registre erros fatais usando o , que requer PHP 5.2+:Você terá que definir as funções
error_mail
eformat_error
. Por exemplo:Use o Swift Mailer para escrever a
error_mail
função.Veja também:
fonte
mail("[email protected]", "My Site: FATAL ERROR", "Details: " . $errno . ' ' . $errstr . ' ' . $errfile . ' ' . $errline);
Acabei de criar esta solução (PHP 5.2.0+):
Diferentes tipos de erro são definidos em constantes predefinidas .
fonte
If an error handler (see set_error_handler ) successfully handles an error then that error will not be reported by this function.
"register_shutdown_function()
deve ser anterior a qualquer erro fatal.use_1T_memory(); /* memory exhausted error here! */ register_shutdown_function('shutDownFunction');
não funcionará como esperado.O PHP não fornece meios convencionais para capturar e recuperar erros fatais. Isso ocorre porque o processamento normalmente não deve ser recuperado após um erro fatal. String que corresponde a um buffer de saída (como sugerido na publicação original, a técnica descrita no PHP.net) é definitivamente desaconselhada. É simplesmente não confiável.
Chamar a função mail () de dentro de um método de tratamento de erros também se mostra problemático. Se você tivesse muitos erros, seu servidor de e-mail seria carregado com trabalho, e você poderia se encontrar com uma caixa de entrada desagradável. Para evitar isso, considere executar um cron para verificar os logs de erros periodicamente e enviar notificações de acordo. Você também pode procurar um software de monitoramento de sistema, como o Nagios .
Para falar um pouco sobre o registro de uma função de desligamento:
É verdade que você pode registrar uma função de desligamento, e essa é uma boa resposta.
O ponto aqui é que normalmente não devemos tentar recuperar de erros fatais, especialmente não usando uma expressão regular no seu buffer de saída. Eu estava respondendo à resposta aceita , que estava vinculada a uma sugestão no php.net que foi alterada ou removida desde então.
Essa sugestão foi usar um regex no buffer de saída durante o tratamento de exceções e, no caso de um erro fatal (detectado pela correspondência com qualquer texto de erro configurado que você estivesse esperando), tente fazer algum tipo de recuperação ou processamento contínuo. Essa não seria uma prática recomendada (acredito que é por isso que também não encontro a sugestão original. Estou ignorando ou a comunidade php diminuiu).
Pode ser interessante notar que as versões mais recentes do PHP (em torno de 5.1) parecem chamar a função shutdown anteriormente, antes que o retorno de chamada do buffer de saída seja chamado. Na versão 5 e anterior, essa ordem era inversa (o retorno de chamada do buffer de saída foi seguido pela função de desligamento). Além disso, desde o 5.0.5 (que é muito anterior à versão 5.2.3 do questionador), os objetos são descarregados muito antes de uma função de desligamento registrada ser chamada, para que você não possa confiar nos seus objetos na memória. muita coisa.
Portanto, registrar uma função de desligamento é bom, mas o tipo de tarefa que deve ser executada por uma função de desligamento provavelmente está limitado a alguns procedimentos suaves de desligamento.
A chave aqui é apenas algumas palavras de sabedoria para quem se depara com essa pergunta e vê o conselho na resposta originalmente aceita. Não regex seu buffer de saída.
fonte
Bem, parece possível pegar erros fatais de alguma outra maneira :)
fonte
Erros fatais ou erros fatais recuperáveis agora jogue casos de
Error
em PHP 7 ou versões superiores . Como qualquer outra exceção, osError
objetos podem ser capturados usando umtry/catch
bloco.Exemplo:
https://3v4l.org/67vbk
Ou você pode usar a
Throwable
interface para capturar todas as exceções.Exemplo:
https://3v4l.org/Br0MG
Para mais informações: http://php.net/manual/en/language.errors.php7.php
fonte
Fatal error: Trait 'FailedTrait' not found in
ao usarReflectionClass
?include "filename.php"
em vez disso, notry
bloco, em seguida, o blocoThrowable
catch pelo menos funcionaParseError
.Eu desenvolvi uma maneira de capturar todos os tipos de erro em PHP (quase todos)! Não tenho certeza sobre E_CORE_ERROR (acho que não funcionará apenas para esse erro)! Mas, para outros erros fatais (E_ERROR, E_PARSE, E_COMPILE ...) funciona bem usando apenas uma função de manipulador de erros! Lá vai a minha solução:
Coloque este código a seguir no seu arquivo principal (index.php):
fonte
Você não pode capturar / manipular erros fatais, mas pode registrá-los / relatá-los. Para depuração rápida, modifiquei uma resposta para este código simples
fonte
Você não pode lançar uma exceção dentro de uma função de desligamento registrada assim:
Mas você pode capturar e redirecionar solicitações para outra página.
fonte
Se você estiver usando PHP> = 5.1.0, faça algo assim com a classe ErrorException:
fonte
Ótima solução encontrada no Zend Framework 2:
Essa classe permite que você inicie o específico
ErrorHandler
algumas vezes, se precisar. E então você também pode parar o manipulador.Use esta classe, por exemplo:
Link para o código completo da classe:
https://github.com/zendframework/zf2/blob/master/library/Zend/Stdlib/ErrorHandler.php
Uma solução talvez melhor é a da Monolog :
Link para o código completo da classe:https://github.com/Seldaek/monolog/blob/master/src/Monolog/ErrorHandler.php
Ele também pode manipular FATAL_ERRORS usando a
register_shutdown_function
função De acordo com esta classe, um FATAL_ERROR é um dos seguintesarray(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR)
.fonte
Preciso lidar com erros fatais de produção para mostrar uma saída HTML 503 Serviço Indisponível com estilo estático . Esta é certamente uma abordagem razoável para "detectar erros fatais". Isto é o que eu fiz:
Eu tenho uma função personalizada de tratamento de erros "error_handler" que exibirá minha página HTML "503 service indisponível" em qualquer E_ERROR, E_USER_ERROR, etc. Isso agora será chamado na função shutdown, detectando meu erro fatal,
na minha função personalizada error_handler, se o erro for E_ERROR, E_USER_ERROR, etc. Eu também chamo
@ob_end_clean();
para esvaziar o buffer, removendo assim a mensagem "erro fatal" do PHP.Tome nota importante da verificação estrita isset () e
@
funções silenciamento pois não queremos que nossos scripts error_handler gerem erros.Ainda concordando com o keparo, a captura de erros fatais anula o objetivo do "erro FATAL", portanto, não é realmente necessário que você faça mais processamento. Não execute nenhuma função mail () neste processo de desligamento, pois você certamente fará backup do servidor de email ou da sua caixa de entrada. Em vez disso, registre essas ocorrências para arquivar e agendar uma tarefa cron para localizar esses arquivos error.log e enviá-los por correio aos administradores.
fonte
O PHP possui erros fatais capturáveis. Eles são definidos como E_RECOVERABLE_ERROR. O manual do PHP descreve um E_RECOVERABLE_ERROR como:
Você pode "capturar" esses erros "fatais" usando set_error_handler () e verificando E_RECOVERABLE_ERROR. Acho útil lançar uma exceção quando esse erro é detectado, e você pode usar try / catch.
Esta pergunta e resposta fornece um exemplo útil: Como capturar um "erro fatal capturável" nas dicas do tipo PHP?
Os erros E_ERROR, no entanto, podem ser manipulados, mas não recuperados, pois o mecanismo está em um estado instável.
fonte
Aqui está apenas um bom truque para obter o método error_handler atual =)
Também quero observar que, se você ligar
O PHP para de exibir o erro. Caso contrário, o texto do erro será enviado ao cliente antes do seu manipulador de erros.
fonte
Como a maioria das respostas aqui é desnecessariamente detalhada, aqui está a minha versão não-feia da resposta mais votada:
fonte
Na verdade não. Os erros fatais são chamados assim, porque são fatais. Você não pode se recuperar deles.
fonte
Eu desenvolvi essa função para tornar possível o código "sandbox" que poderia causar um erro fatal. Como as exceções lançadas a partir do fechamento
register_shutdown_function
não são emitidas a partir da pilha de chamadas de erro pré-fatal, sou forçado a sair após esta função para fornecer uma maneira uniforme de usá-la.fonte
Há certas circunstâncias em que mesmo erros fatais devem ser detectados (talvez seja necessário fazer uma limpeza antes de sair normalmente e não morrer apenas).
Eu implementei um gancho de pré-sistema no meu CodeIgniter aplicativos para que eu possa receber meus erros fatais por e-mails, e isso me ajudou a encontrar bugs que não foram relatados (ou que foram relatados após serem corrigidos, como eu já sabia sobre eles :)).
O Sendemail verifica se o erro já foi relatado, para que ele não envie spam com erros conhecidos várias vezes.
fonte