10
votes

Erreur fatale php

Y a-t-il un moyen de continuer le code (pas de sortie) lorsque vous obtenez une erreur fatale dans PHP? Par exemple, je reçois une erreur fatale du temps et je veux chaque fois que cela se produise pour ignorer cette tâche et continuer avec les autres. Dans ce cas, le script sort.


2 commentaires

Si vous exécutez un script PHP qui nécessite plus de 2-4 secondes pour exécuter, alors vous faites quelque chose de grave. Utilisez une autre technologie ou changez votre flux de travail.


@Alec intelligent, je ne suis pas d'accord avec cela - des emplois cron, etc. régulièrement plus de quelques secondes. Peut-être qu'il fonctionnerait plus vite en C ++, mais vous devrez alors embaucher un programmeur C ++ ...


6 Réponses :


14
votes

Il y a un piratage en utilisant la mémoire tampon de sortie qui vous permettra de connecter certaines erreurs mortelles, mais il n'ya aucun moyen de poursuivre un script après une erreur fatale. C'est ce qui le rend fatal!

Si votre script est chronométré, vous pouvez utiliser set_time_limit () pour le donner plus de temps pour exécuter.


0 commentaires

1
votes

Cela dépend du type d'erreur exacte. Vous pouvez prendre des erreurs en créant votre propre gestionnaire d'erreur. Voir la documentation sur Set_error_handler () , mais pas Tous les types d'erreurs peuvent être attrapés. Regardez l'erreur du délai d'attente que vous obtenez et voyez quel type il est. S'il s'agit d'un de e_error, e_parse, e_core_error, e_core_warning, e_compile_error ou e_compile_warning, vous ne pouvez pas l'attraper avec un gestionnaire d'erreur. Si c'est un autre type, vous le pouvez. Attrapez-le avec le gestionnaire d'erreur et retournez simplement.


0 commentaires

0
votes

Y a-t-il un moyen alors de limiter l'heure d'exécution d'une fonction mais pas tous le script? Par exemple xxx

pour le rendre afin que s'il ne soit pas exécuté en 25 secondes pour revenir non;


0 commentaires

7
votes

"erreur fatale", comme indiqué que le nom indique, est fatale: elle arrête l'exécution du script / programme.

Si vous utilisez php pour générer des pages Web et obtenir une erreur fatale liée à max_execution_time code> qui, par défaut , est égal à 30 secondes, vous faites certainement quelque chose qui prend vraiment trop de mych Time: les utilisateurs n'attendent probablement pas si longtemps pour obtenir la page. P>

Si vous utilisez PHP pour effectuer des calculs lourds, pas Dans une page Web (mais via CLI, ou un cron, ou des trucs similaires) em>, vous pouvez définir une autre (plus grande) em> valeur pour max_execution_time code>. Vous avez deux façons de faire cela: p>

premier est de modifier php.ini, de définir cette valeur (c'est déjà dans le fichier; modifier simplement la valeur de la propriété). Le problème est que cela le modifiera également pour le serveur Web, qui est mauvais (il s'agit d'une mesure de sécurité, après tout) em>. Un meilleur moyen est de créer une copie de php.ini, appelée, par exemple, phpcli.ini et modifier ce fichier. Ensuite, utilisez-le lorsque vous appelez PHP: P>

php -d max_execution_time=60 myscript.php


0 commentaires

1
votes

Si vous avez une version PHP appropriée (PHP> = 5.2 pour error_get_last), vous pouvez essayer la technique décrite ici qui utilise registre_shutdown_function et error_get_last.

Ceci ne vous permettra pas de" continuer "quand vous obtenez un fatal Erreur, mais cela vous permet au moins de loger l'erreur (et peut-être envoyer un email d'avertissement) avant d'afficher une page d'erreur personnalisée à l'utilisateur. p>

Ça marche quelque chose comme ceci: P>

function fatalErrorHandler()
{
    $lastError = error_get_last();
    if (isset($lastError["type"]) && $lastError["type"]==E_ERROR) {
      // do something with the fatal error
    }
}
...
register_shutdown_function('fatalErrorHandler');
  • Vous pouvez utiliser ob_clean () pour supprimer tout contenu généré avant l'erreur fatale. LI>
  • C'est un vraiment em> mauvaise idée de faire quelque chose à plus intensif dans le gestionnaire d'arrêt, cette technique concerne une défaillance gracieuse plutôt que la récupération. LI>
  • Quoi que vous fassiez, n'essayez pas de connecter l'erreur dans une base de données ... Et si c'était un délai d'attente de base de données qui a provoqué l'erreur fatale? LI>
  • Pour une raison quelconque, j'ai eu des problèmes pour obtenir cette technique pour travailler 100% du temps lors du développement de Windows à l'aide de WAMP. LI> ul> p>


0 commentaires

1
votes

La réponse la plus simple que je peux vous donner est cette fonction: http: // php.net/manual/fr/funck.pcntl-fork.php

Plus en détail, ce que vous pouvez faire est:

  • Fourchette La partie du processus que vous pensez peut-être ou pourrait ne pas provoquer une erreur fatale (c'est-à-dire la majeure partie de votre code)
  • Le script qui fourche le processus devrait être un script très simple.

    Par exemple, c'est quelque chose que je ferais avec une file d'attente d'emploi que j'ai: xxx


0 commentaires