begin process at 2012 02 15 20:15:51
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > EXECUTER UN SCRIPT LONGUE DURÉE SANS LIMITATION DU SERVEUR

EXECUTER UN SCRIPT LONGUE DURÉE SANS LIMITATION DU SERVEUR




 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&amp;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&amp;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

Source avec Zip Source avec une capture WEBSH : WEB SHELL POUR ADMINISTRER UN SERVEUR LINUX SANS CLI...
CRÉER UNE MINIATURE LIMITÉE EN SURFACE (ET PAS EN DIMENSIONS...
SAVOIR SI LE VISITEUR EST UN ROBOT D'UN MOTEUR DE RECHERCHE
CRÉER TOUTE UNE CHAINE DE RÉPERTOIRE : EXEMPLE CRÉER "/ESSAI...
SÉCURISER UN TEXTE ENREGISTRÉ SUR LE SERVEUR : SUPPRIMER L'E...

 Sources de la même categorie

EXEMPLE D'APPLICATION DE L'ALGORITHME DE DIJKSTRA EN PHP par philtr8
CLEF POUR EAN 13 ET 14 par RaftY
FONCTION DE CALCUL DU NOMBRE DE DUEL UNIQUE POUR UN NOMBRE N... par mtrix000
Source avec Zip Source avec une capture TRIANGLE DE PASCAL ET SON ÉQUATION par vendeeHdLR89
Source avec Zip CONVERTISSEUR LAMBERT2 ÉTENDU EN COORDONNÉE GÉOGRAPHIQUE (LO... par varfendell

 Sources en rapport avec celle ci

Source avec Zip SCRIPT TRAVAUX POUR VOTRE SITE par FleuryK
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
Source avec Zip Source avec une capture LOGGER LE TEMPS D'EXÉCUTION DE VOS FONCTIONS PHP par djroulo
CLASSE DE CALCUL DE TEMPS D'ÉXECUTION par onigoetz
TEMPS D'EXECUTION par GillesWebmaster

Commentaires et avis

Commentaire de webdeb le 16/03/2008 19:46:11

Le temps d'exécution maximum se configure dans le php.ini (max_execution_time)

Commentaire de MadM@tt le 17/03/2008 00:18:21

Oui mais sur un serveur tu ne peux pas le configurer.

Commentaire de yoman64 le 17/03/2008 01:38:20

Salut,

Biensur que oui sur un serveur tu peux configurer ça... Rare sont les hébergeurs qui désactivent la fonction set_time_limit (enfin rare, disont que ce n'est pas la majorité...sauf ceux qui ont le foutu safemod...)

Et euh... il me semble avoir vu une source semblable il n'y a pas très longtemps.

Ah ouais voila: http://www.phpcs.com/codes/EXECUTER-SCRIPT-DELA-TIMEOUT-PHP_45336.aspx

Commentaire de MadM@tt le 17/03/2008 01:49:58

set_time_limit n'est pas toujours disponible dans des hébergements mutualisés (et ça se comprend).
De plus, ça permet d'éviter des problème de mémoire (on ne sait jamais des script de plusieurs minutes... une erreur est vite faite), ça surcharge moins le serveur donc celui-ci continue à tourner (à peu près) normalement et donc on se fait pas engueuler par monsieur notre hébergeur.

Commentaire de pouda le 17/03/2008 11:37:17

exact merci pour ce code je regarde un peu ce que ca donne car je suis heberger chez 1and1 mutualise en safemod...et le set time limit est vraiment tres court...et pour l'envoie de mail sur phpBB c'est effectivement impossible (+ de 1500 mails)

 Ajouter un commentaire


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&#244;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&#233;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&#233;el. En fait, il me faudrai u calcller le temps d'execution via xmlhttprequest [ par el_bassir ] S.V.P:&nbsp;&nbsp; est ce qu'il ya quelqu'un qui connait un moyen de calculer le temps d'execution&nbsp; d'un script par l'objet XMLHTTPREQUEST?&nbsp;


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,137 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales