Maison  >  Article  >  développement back-end  >  Protection de base contre la limite de temps d'exécution maximale

Protection de base contre la limite de temps d'exécution maximale

Susan Sarandon
Susan Sarandonoriginal
2024-09-25 20:10:02675parcourir

Basic Protection Against Max Execution Time Limit

Quiconque a été confronté à l'importation ou à l'exportation de données a probablement rencontré le problème d'un script exécuté dans un délai d'exécution court. La solution la plus rapide consiste souvent à ajuster la configuration PHP ou à désactiver complètement la limite au début du script. Cependant, prolonger considérablement le temps d’exécution ou le désactiver complètement introduit des risques de sécurité. Un script d'arrière-plan imparable peut entraîner une consommation excessive de ressources.

Lors du traitement des tâches au fil des itérations, il est possible de surveiller les passes individuelles dans le temps et de tenter de mettre fin à l'exécution en douceur avant l'expiration du délai.

// initialize basic variables for further work
$maxExecutionTime = (int)ini_get('max_execution_time');
$estimateCycleTime = 0;
$startTime = microtime(true);

// For demonstration purposes, we use an "infinite" loop with a simulated task lasting 10 seconds
while (true) {
   sleep(10);

   // Calculate the current runtime
   $currentRunTime = microtime(true) - $startTime;

   // Termination can be done either with a fixed constant
   // or by measuring the time of one pass and trying to use
   // the longest possible segment of the runtime
   // limit (has its problem).
   if ($estimateCycleTime === 0) {
       $estimateCycleTime = $currentRunTime;
   }

   // Check if the iteration stop time is approaching.
   // Subtract the time of one pass, which likely won't fit
   // within the window. 
   if (($maxExecutionTime - $estimateCycleTime) < $currentRunTime) {
       echo 'Time is end';
       break;
   }
}

La résiliation anticipée basée sur le calcul d'une passe convient aux cas où un grand nombre de passes doivent être traitées en aussi peu de nouvelles exécutions que possible, et chaque opération en une seule passe prend également beaucoup de temps. Si les passages individuels diffèrent dans leurs exigences de temps, un coefficient doit être ajouté au temps de passage. Une autre option consiste à utiliser une heure prédéfinie :

$beforeEndTime = 1;

if (($maxExecutionTime - $beforeEndTime) < $currentRunTime) {
    echo 'Time is end';
    break;
}

Si le script continue après l'itération, comme la fermeture des connexions aux points de terminaison de l'API, la fermeture de fichiers ou l'exécution d'autres opérations, il est essentiel de ne pas oublier d'ajouter cette heure.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn