Comment attraper le fatal error: Maximum execution time of 30 seconds exceeded in PHP
J'ai été jouer avec un système que je suis en développement et a réussi à obtenir à la cause:
Fatal error: Maximum execution time of 30 seconds exceeded
C'est arrivé quand je faisais quelque chose d'irréaliste, mais, cependant, il pourrait arriver avec un utilisateur.
Personne ne sait si il existe un moyen de récupérer cette exception? J'ai lu un peu partout mais tout le monde semble suggérer d'augmenter le temps imparti.
- Je crois qu'une fois que le temps d'exécution est dépassé, le script est terminé. Dans ce cas, le script qui pourrait avoir attiré l'exception a été tué déjà.
- Erreurs fatales ne peut pas être atteint, (ils ne sont pas des exceptions) ou manipulé. Vous ne pouvez gérer la fin du script gracieusement par l'enregistrement d'une fonction d'arrêt mais le script prendra fin par la suite.
- double possible de Comment puis-je attraper une Erreur Fatale de PHP
- Non, le double n'est pas une "exacte" en double. Il ne marche pas demander la fatale soulevées par le délai d'exécution du script, mais seulement comment attraper une Erreur Fatale en général. Mais depuis que le général a également des réponses spécifiques dans ce cas, il se qualifie pour être un double possible. Si la question est de savoir comment résoudre un script erreur de dépassement de délai, ensuite ses un double de la plupart de ces stackoverflow.com/search?q=maximum+execution+time+php 😉
- Je ne peux pas répondre à cette règle générale, mais dans certaines situations, vous pouvez limiter le temps sur quelque chose de moins que le max_execution_time, et ensuite de prendre qui. Par exemple, curl_setopt($client, CURLOPT_TIMEOUT, 27); volonté de causer le roulage à abandonner après 27 secondes, de sorte que vous n'avez pas le voyage jusqu'à l'erreur fatale.
Vous devez vous connecter pour publier un commentaire.
Vos seules options sont d'augmenter le permis temps d'exécution (mise à 0 rend à l'infini, mais ce n'est pas recommandé) du script ou de générer un nouveau thread et espérer pour le mieux.
La raison que ce n'est pas catchable est qu'il n'est pas vraiment jeté. Pas une seule ligne de code a effectivement déclenché l'erreur, plutôt PHP a dit, "Non, désolé, c'est trop long. Du temps pour arrêter maintenant." Et qui a du sens. Imaginez avoir un script avec un maximum execution time of 30 seconds intercepter cette erreur et de prendre un autre 30 secondes... dans une mauvaise conception du programme, qui ouvre certains plutôt méchant opportunités à exploiter. Au minimum, il va créer des opportunités pour les DOS attaques.
À faire l'essai en tant que documentation de PHP (enfin... au moins l'un de ses lecteurs) dire:
Avoir un regard sur les liens suivants:
Ce n'est pas une exception, c'est une erreur. Il existe des différences importantes entre les exceptions et les erreurs, d'abord et avant tout des erreurs peuvent ne pas être pris avec try/catch de la sémantique.
Les scripts PHP sont construits autour d'un paradigme de court temps de l'exécution, de sorte que PHP est configuré par défaut pour supposer que si un script a été exécuté pendant plus de 30 secondes, il doit être pris dans une boucle infinie et, par conséquent, devrait être terminé. C'est pour éviter un errant script PHP provoquant un déni de service, que ce soit par accident ou par malveillance.
Cependant, les scripts ne parfois ont besoin de plus de temps d'exécution qu'ils sont attribués par défaut.
Vous pouvez essayer de modifier le délai d'exécution maximal, soit en utilisant
set_time_limit()
ou en modifiant la valeur demax_execution_time
dans lephp.ini
fichier d'augmenter la limite. vous pouvez également supprimer la limite entièrement en définissant le temps d'exécution à 0, mais ce n'est pas recommandé.set_time_limit()
peut être désactivé par des mécanismes tels quedisable_functions
il pourrait ne pas être disponible pour vous, de même vous pourriez ne pas avoir accès àphp.ini
. Si ces deux sont le cas, alors vous devriez communiquer avec votre hôte pour obtenir de l'aide.Seule exception est l'exécution des scripts PHP à partir de la ligne de commande. En vertu de ces conditions de fonctionnement, les scripts PHP peuvent être interactifs et la nécessité de passer un long temps de traitement des données ou en attente d'entrée. Pour cette raison, il n'y a pas un
max_execution_time
limite à l'exécution des scripts en ligne de commande par défaut.MODIFIER POUR AJOUTER: PHP 7 erreur de manipulation a eu une refonte majeure. Je crois que les erreurs et les exceptions sont maintenant deux sous-classes de Throwable. Cela peut rendre le ci-dessus ne sont plus pertinentes pour PHP7+, mais je vais avoir à examiner de plus près les spécificités de la gestion des erreurs travaille maintenant pour être sûr.
Il n'y a rien que vous pouvez faire à ce sujet. mais vous pouvez avoir à la fermeture en douceur avec register_shutdown_function
other_function()
être appelé lors de l'arrêt, s'il a été déclaré avant de la boucle infinie?Ouais j'ai testé la solution par TheJanOnline. sleep() ne compte pas en php avec des temps d'exécution voici donc une version de TRAVAIL à durée indéterminée en boucle:
HTML:
Il y a un peu de façon délicate à gérer "Fatal error: Maximum execution time of 30 seconds exceeded" comme exception dans certains cas:
Dans votre code, vous devez mesurer le temps d'exécution et de jeter l'exception plus tôt que le délai d'attente fatale erreur peut être déclenchée. $k = 0.8 est un 80% de temps d'exécution, de sorte que vous avez 20% de temps pour gérer exception.
Je suis venu avec cette fonction de la réponse @pinkal-vansia a donné. Donc je ne suis pas réclame une réponse originale à cette question, mais une réponse à une application pratique. J'ai besoin d'un moyen pour la page pour actualiser lui-même dans le cas d'un dépassement de délai. Depuis j'ai pu observer assez de délais d'attente de mon cURL script pour connaître le code fonctionne, mais que, parfois, pour quelque raison que ce soit, il ne parvient pas à se connecter au serveur distant, ou de lire les servi html entièrement, et qu'à actualiser le problème disparaît, je suis ok avec un script de se rafraîchir à "guérir" un Maximum de délai d'exécution d'erreur.
Pour info, 300 secondes n'est pas trop long pour le raclage de script que je suis en cours d'exécution, ce qui prend un peu moins que pour extraire les données à partir des types de pages que je suis grattage. Parfois, il va de plus en quelques secondes seulement en raison de la connexion des irrégularités. Sachant qu'il est temps de connexion que, parfois, l'échec, plutôt que le traitement du script, il est préférable de ne pas augmenter le délai d'attente, mais plutôt juste actualiser la page et essayez à nouveau.
mettre cela en début de fichier php
EDIT 1
mais d'abord vérifier si il n'y a pas de code comme ceci:
EDIT 2
pour rattraper cette erreur look set_error_handler