Accueil > > > EXÉCUTER UN SCRIPT AU-DELÀ DU TIMEOUT DE PHP
EXÉCUTER UN SCRIPT AU-DELÀ DU TIMEOUT DE PHP
Information sur la source
Description
Ce script montre une méthode permettant d'exécuter un script au-delà du timeout de PHP. J'en suis venu à cette idée ainsi: si je fais par exemple un export d'une grosse base de données avec un script PHP, je risque de dépasser les 30 secondes (le max_execution_time) autorisées par le serveur où je suis hébergé. Alors comment faire? En associant AJAX à PHP! Le principe: Ajax surveille que le script ne s'exécute que pendant un temps t<timeout et fait boucler le script jusqu'à ce que l'exécution soit terminée. Le code présenté ici est un exemple. A vous de l'adapter si vous en avez l'intérêt!
Source
- ############# FICHIER index.php
-
- <html>
- <head>
- <title>Exécuter un script au-delà du timeout de PHP</title>
- <!-- script mootools.js téléchargé sur http://mootools.net/download -->
- <script type="text/javascript" src="mootools.js"></script>
- <script type="text/javascript">
- <?php
-
- // temps maximal d'exécution du script autorisé par le serveur
- $max_time = ini_get('max_execution_time');
- // 30 secondes par défaut:
- if ($max_time == '') $max_time = 30;
-
- // on prend 10% du temps maximal comme marge de sécurité
- $ourtime = ceil(0.9*$max_time);
-
- // variable pour les tests, à retirer en production
- $ourtime = 4;
-
- // variable(s) devant être surveillée(s) - exemple
- $i = 10;
-
- ?>
-
- window.addEvent('domready', function(){
- $('start').addEvent('click', function(e) {
- e = new Event(e).stop();
- var url = "time.php?t=<?php echo $ourtime;?>&i=<?php echo $i;?>";
- new Ajax(url, {method: 'get', evalScripts:true}).request();
- });
- });
- </script>
- </head>
- <body>
- <h3>Exécuter un script au-delà du timeout de PHP</h3>
- <p><a id="start" href="#">Cliquez ici</a> pour lancer le test</p>
- Timeout après: <b><?php echo $ourtime;?> secondes</b><br />
- Temps d'une boucle: <b>environ 1 seconde</b><br /><br />
- Résultat:<br /><div id="result"></div>
- </body>
- </html>
-
- ############# FICHIER time.php
-
- <?php
- header('Content-type: text/html; charset=iso-8859-1');
-
- echo '<script type="text/javascript">'."\n";
-
- // récupération des variables;
- $main_ourtime = $_GET['t'];
- $i = $_GET['i'];
- $temps_total = $_GET['tillnow'];
- $ourtime = $main_ourtime;
-
- function timer(){ //chronomètre - http://www.phpcs.com/code.aspx?ID=32471
- $time=explode(' ',microtime());
- return $time[1] + $time[2];
- }
-
- $rep = '';
-
- $start_while=timer(); // début du chronométrage du while
- while ($i>0 && $ourtime>0){
-
- $start=timer(); // début du chronométrage de l'itération
-
- sleep(1); // traitement - le sleep simule un temps de traitement de une seconde
-
- $i--;
-
- $ourtime -= (int)number_format(timer()-$start,7);
- $rep .= $i.'... ';// texte de sortie
- }
- $end_while = number_format(timer()-$start_while,7);
- $temps_total += $end_while;
-
- echo '$(\'result\').innerHTML += \'<b>'.$rep.'(<font color="#00aa00">'.$end_while.' sec.</font>)</b><br />\';'."\n";
-
- if($i>0){ // si l'exécution du script a été interrompue pour éviter le timeout, on reprend où on s'est arrêté
- echo 'var url = "time.php?t='.$main_ourtime.'&i='.$i.'&tillnow='.$temps_total.'";
-
- new Ajax(url, {
- method: \'get\',';
- if ($i>0)
- echo 'evalScripts:true,';
- echo '}).request();';
- }
- else
- echo '$(\'result\').innerHTML += \'<b><font color="#0000aa">terminé en '.$temps_total.' secondes!</font></b><br />\';'."\n"; // traitement des données
-
- echo '</script>';
- ?>
############# FICHIER index.php
<html>
<head>
<title>Exécuter un script au-delà du timeout de PHP</title>
<!-- script mootools.js téléchargé sur http://mootools.net/download -->
<script type="text/javascript" src="mootools.js"></script>
<script type="text/javascript">
<?php
// temps maximal d'exécution du script autorisé par le serveur
$max_time = ini_get('max_execution_time');
// 30 secondes par défaut:
if ($max_time == '') $max_time = 30;
// on prend 10% du temps maximal comme marge de sécurité
$ourtime = ceil(0.9*$max_time);
// variable pour les tests, à retirer en production
$ourtime = 4;
// variable(s) devant être surveillée(s) - exemple
$i = 10;
?>
window.addEvent('domready', function(){
$('start').addEvent('click', function(e) {
e = new Event(e).stop();
var url = "time.php?t=<?php echo $ourtime;?>&i=<?php echo $i;?>";
new Ajax(url, {method: 'get', evalScripts:true}).request();
});
});
</script>
</head>
<body>
<h3>Exécuter un script au-delà du timeout de PHP</h3>
<p><a id="start" href="#">Cliquez ici</a> pour lancer le test</p>
Timeout après: <b><?php echo $ourtime;?> secondes</b><br />
Temps d'une boucle: <b>environ 1 seconde</b><br /><br />
Résultat:<br /><div id="result"></div>
</body>
</html>
############# FICHIER time.php
<?php
header('Content-type: text/html; charset=iso-8859-1');
echo '<script type="text/javascript">'."\n";
// récupération des variables;
$main_ourtime = $_GET['t'];
$i = $_GET['i'];
$temps_total = $_GET['tillnow'];
$ourtime = $main_ourtime;
function timer(){ //chronomètre - http://www.phpcs.com/code.aspx?ID=32471
$time=explode(' ',microtime());
return $time[1] + $time[2];
}
$rep = '';
$start_while=timer(); // début du chronométrage du while
while ($i>0 && $ourtime>0){
$start=timer(); // début du chronométrage de l'itération
sleep(1); // traitement - le sleep simule un temps de traitement de une seconde
$i--;
$ourtime -= (int)number_format(timer()-$start,7);
$rep .= $i.'... ';// texte de sortie
}
$end_while = number_format(timer()-$start_while,7);
$temps_total += $end_while;
echo '$(\'result\').innerHTML += \'<b>'.$rep.'(<font color="#00aa00">'.$end_while.' sec.</font>)</b><br />\';'."\n";
if($i>0){ // si l'exécution du script a été interrompue pour éviter le timeout, on reprend où on s'est arrêté
echo 'var url = "time.php?t='.$main_ourtime.'&i='.$i.'&tillnow='.$temps_total.'";
new Ajax(url, {
method: \'get\',';
if ($i>0)
echo 'evalScripts:true,';
echo '}).request();';
}
else
echo '$(\'result\').innerHTML += \'<b><font color="#0000aa">terminé en '.$temps_total.' secondes!</font></b><br />\';'."\n"; // traitement des données
echo '</script>';
?>
Conclusion
AJAX est traité ici avec l'excellente librairie mootools disponible sur http://www.mootools.net
Une condition sine qua none pour que cette astuce fonctionne est que le temps d'exécution d'une itération dans la boucle soit inférieur au time out.
L'exécution de l'exemple ci-dessus donne:
9... 8... 7... 6... (4.0000000 sec.) 5... 4... 3... 2... (4.0000000 sec.) 1... 0... (2.0000000 sec.) terminé en 10 secondes!
Historique
- 07 janvier 2008 19:18:05 :
- orthographe
- 07 janvier 2008 19:46:48 :
- NE FONCTIONNE QU'AVEC FF! Pour une raison que j'ignore, Mootools que pourtant j'adore refuse de faire son boulot avec IE... damned, je m'y plonge!
- 07 janvier 2008 21:25:27 :
- Ajout d'un zip contenant une version améliorée sans Mootools
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Exécuter un lien sans charger la page [ par Siffly ]
Je m'explique, je souhaite me faire un petit script d'auto - référencement dans certains moteur de recherche.Dans ce script, il y aurai une url par mo
Exécuter du PHP dans un OnClick [ par camouille ]
Bonjour !J'ai vu ton message avec le coup d'afficher en javascript, et moi aussi j'essaie d'excuter du code PHP dans un OnClick d'un bouton.J'ajoute q
exécuter un fichier exe avec php [ par skmancuso ]
Exécuter un programme externe bis [ par fredo35m ]
Bonjour, je reviens vers vous car j'ai toujours un soucis pour lancer un exécutable !! A priori ça lance le programme je l'ai dans mon gesti
Exécuter un .BAT en PHP [ par poulbert ]
Je cherche à éxécuter un .bat dans mon code mais je ne sais pas comment faire.Ou faut il placer le .bat?N'hésitez pas à etre
Exécuter un script a une date précise [ par Tipingouin ]
Bonjour Je voudrais savoir si il serait possible d'executer un script PHP à une date précise.... Merci d'avance
pas besoin de recharger la page pour exécuter un script php?? [ par Linuss ]
Bonjour à tous, J'ai parfois vu quelques sites qui n'avaient pas besoin de recharger une page web pour exécuter un script php... quelqu'un s
crontab pour windows? [ par Erick007 ]
Salut, je cherche un petit logiciel qui pourrait faire comme le fichier crontab de linux. Pour ceux qui ne connaissent pas crontab, c'est un petit fic
Exécuter une fonction sur un autre serveur [ par Yapas ]
Bonjour,Voila je sais pas si c'est possible mais j' aimerai appeller une fonction sur un autre serveur (dans mon cas lycos) et y faire tourner la fonc
Exécuter une page PHP à une date et une heure précise [ par Drazounet ]
Bonjour à tous,Je suis en train de créer un site de vente aux enchères. Sur mon site, un vendeur peut sélectionner la liste de ses acheteurs potentiel
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
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 Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.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 LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|