Domanda

Conoscete qualche soluzione per recuperare l'errore fatale di PHP: " ammessi dimensione della memoria ... esaurito "

ho una funzione di spegnimento che viene chiamata quando compare un errore fatale. Questa funzione crea un ErrorException da esso, e lo registra.

Il problema è: quando non c'è più memoria disponibile, non può registrare l'errore (accedo Firebug, via FirePHP, con Zend Framework)

.

Quindi, ciò che intendo per " come recuperare da esso ", è come eseguire log degli errori di base, e lasciare che Zend Framework inviare le intestazioni, in modo che l'errore viene registrato (in Firebug nel mio caso) come qualsiasi altro errore?

Grazie

È stato utile?

Soluzione

Questo errore è un errore fatale - che significa che non si può recuperare da esso. Se il PHP ha colpito limite di memoria di essa la, non sarà in grado di allocare più memoria per creare il tuo eccezione e qualsiasi altra memoria di cui ha bisogno per portare avanti la sua esecuzione.

C'è un altro tipo di errore - "errore fatale catchable", che come suggerisce il nome, possono essere catturati in un try / catch, ma purtroppo l'allocazione dimensione della memoria non è uno di loro

.

Altri suggerimenti

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

semplicemente dividere la memory_get_usage per 1024 quadrato per confrontarlo con un valore megabyte 'normale' di '70'.

Mi sono imbattuto in problemi di memoria con PHP all'interno di un ciclo for e scritto questa semplice istruzione if per evitare che il mio script da scatenando un errore fatale. Inoltre, il server mi è stato operativo su non mi ha permesso di modificare il limite di memoria (questo è spesso il caso in alcuni offerte cloud come OpenShift o grandi host web come Dreamhost.) Non ho davvero notato alcun serio degrado delle prestazioni ( in PHP 5.3 che può gestisce funzioni come questo un po 'diverso rispetto 4.x PHP o 5.x ... in ogni caso l'implicazione esecuzione di uno script dando un errore fatale supera ogni testa la chiamata di funzione può costringere. e sarebbe anche evitare uno script in fuga dal consumare tutta la RAM disponibile.

Molti potrebbero obiettare; Oh, hey il software non è ottimizzato. Sì. Probabilmente hai ragione; ma con dati complessi set si può spremere più di tanto le prestazioni fuori prima è necessario gettare più memoria a esso; e la caccia a errori di memoria in un flusso ajax può essere molto frustrante; soprattutto quando non si è sicuri dove i file di log sono.

Il modo normale di personalizzare la gestione degli errori è attraverso

set_error_handler - Imposta una definita dall'utente errore di funzione di gestione

La documentazione per questo stato funzione ( sottolineatura mia ):

  

I seguenti tipi di errore non possono essere gestiti con una funzione definita dall'utente: E_ERROR , E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, e la maggior parte di E_STRICT cresciuto nel file in cui viene chiamato set_error_handler ().

Quindi, non funzionerà regolarmente, ma si può provare

A partire dal PHP7, Errori ed eccezioni sono Throwables, in modo da poter provare / catturarli:

errori PHP vengono inviati per impostazione predefinita per il vostro apache /path/to/apache/logs/error.log log degli errori e si può vedere lì.

Hai un'idea per un trucco non testato e sarei felice di sapere se ha aiutato. Assegnare una variabile globale quando si primo registro funzione di spegnimento e rilasciarlo quando il codice della funzione di arresto viene eseguito per primo. Si può quindi avere memoria sufficiente per creare l'oggetto eccezione. Fatemi sapere se ha funzionato e si prega di pubblicare il codice qui.

Questo ha funzionato bene per me:

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

Questo presuppone che il limite di memoria è nel formato 123M.

Una mi viene in mente è che quando stai facendo l'operazione intensivo di memoria che si interrogare manualmente memory_get_usage() su base regolare (ad esempio ogni iterazione del ciclo) e scaricare il vostro intestazioni / errore quando si va oltre un certo valore, che è fail-safe al di sotto del limite di script. Esso rallenterà il vostro scritto giù un sacco, ma almeno si otterrà qualcosa di nuovo.

In alternativa, e potrebbe non essere in grado di fare questo, eseguire la roba intensivo di memoria come uno script CLI-based chiamato da dentro la tua roba web-based utilizzando exec. La parte CLI potrebbe cadere, ma la parte web sarà in grado di riferire su di esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top