Accueil > > > EXECUTER UN SCRIPT LONGUE DURÉE SANS LIMITATION DU SERVEUR
EXECUTER UN SCRIPT LONGUE DURÉE SANS LIMITATION DU SERVEUR
Information sur la source
Description
Généralement quand on doit exécuter des scripts d'entretien de base de données par exemple, ceux-ci peuvent prendre plusieurs minutes si la base de données est conséquente. Pour contourner le problème de limitation de temps d'exécution des scripts à 30 secondes, voici une astuce: découper le gros script en sous-scripts de quelques secondes La page ci dessous va donc executer une partie du script puis se relancer pour continuer l'execution du script dans une nouvelle page. Placez votre script dans la fonction Script (au tout début de la page).
Source
- <?php
-
- // PRINCIPE :
- // Le script est executé par tranches afin de ne pas surcharger
- // le serveur.
-
- // CONFIGURATION :
- // Temps d'execution maximum d'une "tranche" en secondes
- $tempsExecMax = 2;
- // Temps d'attente entre chaque "tranche" en millisecondes
- $tempsRepos = 100;
-
- /* ----------------------------------------------------------
- Placez dans cette fonction le script à executer
- retour :
- Retourne une valeur qui sera utilisée pour relancer le
- script (valeur start lors de la prochaine execution de
- la fonction).
- Si cette valeur vaut -1, alors l'execution du
- script est terminée.
- start :
- Valeur repérant la valeur renvoyée par l'execution
- précédente de la fonction Script. Si cette valeur vaut 0,
- alors il s'agit de la première execution de cette fonction.
- Cette valeur n'est qu'un repère pour mémoriser
- l'avancement de l'execution, elle n'est pas utilisée hors
- de cette fonction. Elle peut donc représenter
- n'importe quoi.
- tempsExec :
- Temps maximum d'execution de la fonction. Si la fonction
- atteint cette limite, elle se termine et renvoie une
- valeur de retour.
- ---------------------------------------------------------- */
- function Script( $start, $tempsExec )
- {
- // Repère le temps d'execution de la fonction
- list($usec, $sec) = explode(' ', microtime());
- $start_time=(float)$usec + (float)$sec;
- $new_time = $start_time;
- /* ----------------------------------------------------------
- Placez ici votre code d'initalisation si besoin
- */
-
- // ----------------------------------------------------------
- // Tant qu'on reste dans le temps imparti
- while ($new_time - $start_time < $tempsExec)
- {
- /* ----------------------------------------------------------
- Placez ici votre code
- */
-
- // ----------------------------------------------------------
- // Temps d'exécution de la page
- list($usec, $sec) = explode(" ", microtime());
- $new_time=(float)$usec + (float)$sec;
- }
- /* ----------------------------------------------------------
- Précisez la valeur de retour
- */
- // return xxx;
- // ----------------------------------------------------------
- }
-
-
- // Gestion de l'autorelancement de la page
- //ob_start();
- header("Expires: Mon, 1 Dec 2003 01:00:00 GMT");
- header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
- header("Cache-Control: no-store, no-cache, must-revalidate");
- header("Cache-Control: post-check=0, pre-check=0", false);
- header("Pragma: no-cache");
- ?>
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title>Script longue durée</title>
- <meta http-equiv="CONTENT-TYPE" content="text/html; charset=iso-8859-1"/>
- <meta http-equiv="CONTENT-LANGUAGE" content="FR"/>
- <meta http-equiv="Cache-Control" content="no-cache/"/>
- <meta http-equiv="Pragma" content="no-cache"/>
- <meta http-equiv="Expires" content="-1"/>
- </head>
-
- <body style="font-family: Verdana; font-size: 12px">
- <p style="font-size: 13px; font-weight: bold; margin-bottom: 30px">
- Exécution d'un script de longue durée
- par découpage et relancement automatique.
- </p>
- <div>
- <p>
- Avancement de l'exécution :
- <?php
- // On récupère l'avancement du script
- $run = 0;
- if (isset($_GET['run'])) $run = $_GET['run'];
- $start = 0;
- if (isset($_GET['start'])) $start = $_GET['start'];
- // Affichage de l'avancement actuel
- if ($run == 1)
- {
- echo $start;
- }
- else
- {
- echo 'Exécution non démarrée';
- }
- // Appel du script
- $start = Script( $start, $tempsExecMax );
- // Si exécution terminée
- if (($run==1) and ($start == -1))
- {
- echo '<br><b>Exécution terminée</b>';
- }
- ?>
- </p>
-
- <?php
- // Si l'execution n'est pas démarrée ou est terminée
- if (($run != 1) or ($start == -1))
- {
- // On propose de la démarrer
- ?>
- <p style="font-weight: bold">
- <a href="<?php echo $_SERVER["PHP_SELF"]; ?>?start=0&run=1"
- title="Lancer le script">
- Démarrer l'exécution du script</a>
- </p>
- <?php
- }
- else
- // Si l'execution est lancée, on la continue
- {
- // Si l'execution n'est pas terminée
- if ($start > -1)
- {
- // Relancement du script
- if ($tempsRepos != 0)
- {
- ?>
- <p>
- Attente de
- <?php echo $tempsRepos; ?> millisecondes
- avant la reprise de l'execution.
- </p>
- <?php
- }
- echo ("<script language=\"JavaScript\"
- type=\"text/javascript\">window.setTimeout('location.href=\"".$_SERVER["PHP_SELF"]."?start=$start&run=1\";',500+$tempsRepos);
- </script>\n");
- echo ("<noscript>\n");
- echo ("<p><a href=\"".$_SERVER["PHP_SELF"]."?start=$start&run=1\">Cliquez ici pour continuer</a> (Activez JavaScript pour le faire automatiquement)</p>\n");
- echo ("</noscript>\n");
-
- echo ("<p><b><a href=\"".$_SERVER["PHP_SELF"]."\">Arrêter l'exécution du script</a></b></p>\n");
- }
- }
- ?>
- </div>
-
- <p style="font-size: 11px; margin-top: 50px; text-indent: 0px; text-align: center">
- Par <a title="Mon site web" href="http://matthieu.napoli.free.fr/">
- Matthieu Napoli<a/>
- </p>
- </body>
<?php
// PRINCIPE :
// Le script est executé par tranches afin de ne pas surcharger
// le serveur.
// CONFIGURATION :
// Temps d'execution maximum d'une "tranche" en secondes
$tempsExecMax = 2;
// Temps d'attente entre chaque "tranche" en millisecondes
$tempsRepos = 100;
/* ----------------------------------------------------------
Placez dans cette fonction le script à executer
retour :
Retourne une valeur qui sera utilisée pour relancer le
script (valeur start lors de la prochaine execution de
la fonction).
Si cette valeur vaut -1, alors l'execution du
script est terminée.
start :
Valeur repérant la valeur renvoyée par l'execution
précédente de la fonction Script. Si cette valeur vaut 0,
alors il s'agit de la première execution de cette fonction.
Cette valeur n'est qu'un repère pour mémoriser
l'avancement de l'execution, elle n'est pas utilisée hors
de cette fonction. Elle peut donc représenter
n'importe quoi.
tempsExec :
Temps maximum d'execution de la fonction. Si la fonction
atteint cette limite, elle se termine et renvoie une
valeur de retour.
---------------------------------------------------------- */
function Script( $start, $tempsExec )
{
// Repère le temps d'execution de la fonction
list($usec, $sec) = explode(' ', microtime());
$start_time=(float)$usec + (float)$sec;
$new_time = $start_time;
/* ----------------------------------------------------------
Placez ici votre code d'initalisation si besoin
*/
// ----------------------------------------------------------
// Tant qu'on reste dans le temps imparti
while ($new_time - $start_time < $tempsExec)
{
/* ----------------------------------------------------------
Placez ici votre code
*/
// ----------------------------------------------------------
// Temps d'exécution de la page
list($usec, $sec) = explode(" ", microtime());
$new_time=(float)$usec + (float)$sec;
}
/* ----------------------------------------------------------
Précisez la valeur de retour
*/
// return xxx;
// ----------------------------------------------------------
}
// Gestion de l'autorelancement de la page
//ob_start();
header("Expires: Mon, 1 Dec 2003 01:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Script longue durée</title>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=iso-8859-1"/>
<meta http-equiv="CONTENT-LANGUAGE" content="FR"/>
<meta http-equiv="Cache-Control" content="no-cache/"/>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="-1"/>
</head>
<body style="font-family: Verdana; font-size: 12px">
<p style="font-size: 13px; font-weight: bold; margin-bottom: 30px">
Exécution d'un script de longue durée
par découpage et relancement automatique.
</p>
<div>
<p>
Avancement de l'exécution :
<?php
// On récupère l'avancement du script
$run = 0;
if (isset($_GET['run'])) $run = $_GET['run'];
$start = 0;
if (isset($_GET['start'])) $start = $_GET['start'];
// Affichage de l'avancement actuel
if ($run == 1)
{
echo $start;
}
else
{
echo 'Exécution non démarrée';
}
// Appel du script
$start = Script( $start, $tempsExecMax );
// Si exécution terminée
if (($run==1) and ($start == -1))
{
echo '<br><b>Exécution terminée</b>';
}
?>
</p>
<?php
// Si l'execution n'est pas démarrée ou est terminée
if (($run != 1) or ($start == -1))
{
// On propose de la démarrer
?>
<p style="font-weight: bold">
<a href="<?php echo $_SERVER["PHP_SELF"]; ?>?start=0&run=1"
title="Lancer le script">
Démarrer l'exécution du script</a>
</p>
<?php
}
else
// Si l'execution est lancée, on la continue
{
// Si l'execution n'est pas terminée
if ($start > -1)
{
// Relancement du script
if ($tempsRepos != 0)
{
?>
<p>
Attente de
<?php echo $tempsRepos; ?> millisecondes
avant la reprise de l'execution.
</p>
<?php
}
echo ("<script language=\"JavaScript\"
type=\"text/javascript\">window.setTimeout('location.href=\"".$_SERVER["PHP_SELF"]."?start=$start&run=1\";',500+$tempsRepos);
</script>\n");
echo ("<noscript>\n");
echo ("<p><a href=\"".$_SERVER["PHP_SELF"]."?start=$start&run=1\">Cliquez ici pour continuer</a> (Activez JavaScript pour le faire automatiquement)</p>\n");
echo ("</noscript>\n");
echo ("<p><b><a href=\"".$_SERVER["PHP_SELF"]."\">Arrêter l'exécution du script</a></b></p>\n");
}
}
?>
</div>
<p style="font-size: 11px; margin-top: 50px; text-indent: 0px; text-align: center">
Par <a title="Mon site web" href="http://matthieu.napoli.free.fr/">
Matthieu Napoli<a/>
</p>
</body>
Conclusion
Votre script doit gérer 2 parametres :
Valeur de retour : Retourne une valeur qui sera utilisée pour relancer le script (valeur start lors de la prochaine execution de la fonction). Si cette valeur vaut -1, alors l'execution du script est terminée. parametre start : Valeur repérant la valeur renvoyée par l'execution précédente de la fonction Script. Si cette valeur vaut 0, alors il s'agit de la première execution de cette fonction. Cette valeur n'est qu'un repère pour mémoriser l'avancement de l'execution, elle n'est pas utilisée hors de cette fonction. Elle peut donc représenter n'importe quoi. parametre tempsExec : Temps maximum d'execution de la fonction. Si la fonction atteint cette limite, elle se termine et renvoie une valeur de retour.
En espérant que ça vous serve
MadMatt
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
temps d'execution de script max_execution_time [ par vincentforce ]
Bonjour,J'ai un soucis au niveau du temps d'execution de script sur lequel, apparemment je n'ai aucun contrôle : dans le fichier php.ini, la vari
Execution d'un script sur le serveur !!! [ par titof1977 ]
Je cherche le moyen d'excuter un script sur le serveur à partir d'un client sans être obligé d'ouvrir une fenêtre internet qql pourrait-il m'aider ???
durée d'execution d'un script coté serveur? [ par nlh ]
Bonjour bonjour...je me demandai :j'ai un script qui est tres tres tres long a executer, il effectue une operation sur des milliers de champs d'une bd
Probleme d'execution de script shell en remote. [ par coper23 ]
Bonjour,Mon probleme:j'essaye d'executer un script sur une machine distante (en utilisant system() , `` ..etc) , mais ces fonctions attendent que le s
execution de programmes externes [ par simonced ]
Voilà, je travaille sur un script qui lance une application externe sur mon serveur (winXP / apache).Mais rien n'y fait, ca ne marche pas.J'ai essayé
colle [ par conan76 ]
Une petite colle,Je voudrais tester dans le but d'optimisations plusieurs choses :1) temps de traitement du script PHP2) poids de la page récupérerain
temps d'execution d'une requete [ par michong ]
salut a tous je voudrais avoir le code pour calculer le temps d'execution d'une requete merci a tous
Script en arriere plan aprés execution [ par DiJiTooL ]
Bonjour,J'ai un server apache php avec tout les droits.Lorsque mon php s'execute, il va faire quelque verification dans la base de donnée puis se
jeu de gestion de tennis [ par probordelais ]
Bonjour,Je fais un jeu de gestion d'un club de tennis en php. Le plus difficile est la gestion des matchs en temps réel. En fait, il me faudrai u
calcller le temps d'execution via xmlhttprequest [ par el_bassir ]
S.V.P: est ce qu'il ya quelqu'un qui connait un moyen de calculer le temps d'execution d'un script par l'objet XMLHTTPREQUEST?
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|