Comment se remettre d'une erreur fatale « La taille maximale autorisée de mémoire épuisée »

StackOverflow https://stackoverflow.com/questions/2318858

  •  22-09-2019
  •  | 
  •  

Question

Connaissez-vous une solution pour récupérer de l'erreur fatale PHP: " taille maximale autorisée pour la mémoire ... épuisé "

J'ai une fonction d'arrêt qui est appelée lorsque apparaît une erreur fatale. Cette fonction crée un ErrorException de celui-ci, et l'enregistre.

Le problème est: quand il n'y a plus de mémoire disponible, il ne peut pas enregistrer l'erreur (je me connecte Firebug, via FirePHP, avec Zend Framework)

.

Alors qu'est-ce que je veux dire par « comment en remettre », est de savoir comment effectuer journal des erreurs de base, et que Zend Framework envoyer les en-têtes, de sorte que l'erreur est enregistrée (en Firebug dans mon cas) comme toute autre erreur?

Merci

Était-ce utile?

La solution

Cette erreur est une erreur fatale - cela signifie que vous ne pouvez pas récupérer. Si PHP a atteint sa limite de mémoire, il ne sera pas en mesure d'allouer plus de mémoire pour créer votre exception et toute autre mémoire dont elle a besoin pour poursuivre son exécution.

Il existe un autre type d'erreur - « erreur fatale capturables » qui, comme son nom l'indique, peut être pris dans un try / catch, mais malheureusement, l'allocation de taille de la mémoire n'est pas un d'entre eux

.

Autres conseils

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

I il suffit de diviser le memory_get_usage par 1024 au carré de la comparer à une « normale » de méga-octet de valeur « 70 ».

Je suis tombé sur des problèmes de mémoire avec php dans une boucle et écrit cette simple instruction if pour empêcher mon script de déclencher une erreur fatale. De plus, le serveur je fonctionnais sur ne m'a pas permis de modifier la limite de mémoire (ce qui est souvent le cas dans certaines offres de cloud comme OpenShift ou grands hébergeurs comme dreamhost.) Je ne l'ai pas vraiment remarqué des dégradations de performance graves ( en php 5.3 qui peut gère des fonctions telles que ce peu différemment que php 4.x ou 5.x ... en tout cas l'implication de la performance d'un script donnant une erreur fatale l'emporte sur les frais généraux de l'appel de fonction peut forcer. et permettrait également d'éviter un script emballement de la consommation tout RAM disponible.

Beaucoup diront; oh hey votre logiciel n'est pas optimisé. Oui. Tu as probablement raison; mais avec des données complexes, vous ne pouvez fixe presser tant la performance avant que vous devez jeter plus de mémoire à elle; et la chasse aux erreurs de mémoire dans un flux ajax peut être très frustrant; surtout quand vous ne savez pas où vos fichiers journaux sont.

La façon régulière pour personnaliser la gestion des erreurs est par

set_error_handler - Définit une défini par l'utilisateur fonction de gestionnaire d'erreur

Les documents de cet état de fonction ( Souligné par l'auteur ):

  

Les types d'erreurs suivants ne peuvent pas être manipulées avec une fonction définie par l'utilisateur: E_ERROR , E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, et la plupart des E_STRICT soulevée dans le fichier dans lequel set_error_handler () est appelée.

Alors, il ne fonctionnera pas régulièrement, mais vous pouvez essayer

Au PHP7, erreurs et exceptions sont Throwables, vous pouvez essayer / les attraper:

erreurs PHP sont envoyés par défaut à votre erreur apache /path/to/apache/logs/error.log journal et vous pouvez le voir là.

Vous avez une idée pour un truc non testé et je serais heureux de savoir si elle a aidé. Allouer une variable globale lorsque vous enregistrez la fonction d'arrêt et relâchez quand est d'abord exécuté le code de la fonction d'arrêt. Vous pouvez alors une mémoire suffisante pour créer l'objet d'exception. Faites-moi savoir si cela a fonctionné et s'il vous plaît publier le code ici.

a bien fonctionné pour moi:

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

Cela suppose votre limite de mémoire est au format 123M.

Un que je peux penser à vous est que lorsque vous faites votre opération intensive de mémoire vous interroger manuellement memory_get_usage() sur une base régulière (par exemple, chaque itération de la boucle) et vider vos en-têtes / erreur quand il va sur une valeur failsafe qui est en dessous de la limite de script. Il va ralentir votre script vers le bas beaucoup, mais au moins vous obtiendrez quelque chose.

Ou, et vous ne pouvez pas être en mesure de le faire, exécutez la mémoire des choses intensive comme un script basé sur CLI appelé à l'intérieur de vos affaires sur le Web en utilisant exec. La partie CLI pourrait tomber, mais la partie Web sera en mesure d'en faire rapport.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top