Pergunta

Você conhece qualquer solução para se recuperar do erro fatal do PHP: "Tamanho da memória permitido ... exausto"

Eu tenho uma função de desligamento que é chamada quando um erro fatal aparece. Esta função cria uma Errorexception a partir dela e a registra.

O problema é: quando não há mais memória disponível, ele não pode registrar o erro (eu faço login no Firebug, via Firephp, com a estrutura ZEND).

Então, o que quero dizer com "Como se recuperar disso", é como executar o log de erros básicos e deixar a estrutura Zend enviar os cabeçalhos, para que o erro seja registrado (no Firebug no meu caso) como qualquer outro erro?

Obrigado

Foi útil?

Solução

Este erro é um erro fatal - isso significa que você não pode se recuperar. Se o PHP tiver atingido seu limite de memória, não poderá alocar mais memória para criar sua exceção e qualquer outra memória necessária para realizar sua execução.

Há outro tipo de erro - "erro fatal capturável", que, como o nome sugere, pode ser capturado em uma tentativa/captura, mas infelizmente a alocação do tamanho da memória não é uma delas.

Outras dicas

if((memory_get_usage() / 1024 /1024) < 70)

Eu simplesmente divido o memória_get_usage por 1024 ao quadrado para compará -lo com um valor de megabyte 'normal' de '70'.

Eu encontrei problemas de memória com o PHP dentro de um loop e escrevi esta instrução IF simples para impedir que meu script desative um erro fatal. Além disso, o servidor em que eu estava operando não me permitiu modificar o limite de memória (esse geralmente é o caso em algumas ofertas de nuvem como o OpenShift ou grandes hosts da Web como o DreamHost.) Eu realmente não notei nenhuma degradação grave de desempenho ( No Php 5.3, que pode lidar com funções como essa ligeiramente diferente do PHP 4.x ou 5.x ... de qualquer forma, a implicação de desempenho de um script que dá um erro fatal supera qualquer sobrecarga que a chamada de função possa forçar. E também impediria Um script descontrolado de consumir toda a RAM disponível.

Muitos podem discutir; Oh, ei, seu software não está otimizado. Sim. Você provavelmente está certo; Mas com conjuntos de dados complexos, você só pode espremer tanto desempenho antes de precisar jogar mais memória; e caçar erros de memória em um fluxo de Ajax pode ser muito frustrante; Especialmente quando você não tem certeza de onde estão seus arquivos de log.

A maneira regular de personalizar o manuseio de erros é através

set_error_handler -Define uma função de manipulador de erros definida pelo usuário

Os documentos para este estado de função (Ênfase minha):

Os seguintes tipos de erro não podem ser tratados com uma função definida pelo usuário: E_error, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING e a maior parte do E_STRITT criado no arquivo onde Set_error_Handler () é chamado.

Então, não funcionará regularmente, mas você pode tentar

A partir do PHP7, erros e exceções são lançáveis, para que você possa tentar/pegá -los:

Os erros de PHP são enviados por padrão para o seu log de erros do Apache /path/to/apache/logs/error.log E você pode ver isso lá.

Tive uma ideia para um truque não testado e ficaria feliz em saber se isso ajudou. Aloce alguma variável global quando você registra a função de desligamento e libera -a quando o código da função de desligamento for executado pela primeira vez. Você pode ter memória suficiente para criar o objeto de exceção. Deixe -me saber se funcionou e publique o código aqui.

Isso funcionou bem pra mim:

try {
    ini_set('memory_limit', (ini_get('memory_limit')+1).'M');
} catch(Exception $e) {}

Isso pressupõe que seu limite de memória está no formato 123M.

Um que eu consigo pensar é que você quando você está fazendo sua operação intensiva de memória que você consulta manualmente memory_get_usage() regularmente (por exemplo, todas as iterações de loop) e despejam seus cabeçalhos/erros quando ele passa por algum valor de falha, que está abaixo do limite de script. Isso diminuirá muito o seu script, mas pelo menos você receberá algo de volta.

Ou, e você pode não ser capaz de fazer isso, execute as coisas intensivas em memória como um script baseado em CLI chamado de dentro de suas coisas baseadas na Web usando o EXEC. A parte da CLI pode cair, mas a Web Part poderá relatá -la.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top