Page 1 sur 1
Maximum execution time
Posté : 12 août 2005, 03:13
par HD
salut
j'ai un programme composé d'une boucle
while ($id<$nbr) {
qui execute tellement de requetes externes, recuperations de pages web aux 4coins du net, edition,... qu'au bout de 2 executions de cette boucle j'ai
Fatal error: Maximum execution time of 30 seconds exceeded in c:\program files\easyphp\www\projet1\bourse\03_majcours.php on line 36
sachant que :
- je ne veux pas toucher au contenu de la boucle (non negociable

)
- et que je ne veux pas modifier le serveur php (pour avoir un code qui s'execute COMPLETEMENT meme dans les serveurs limités à30secondes
y a t il une solution ? merci
Posté : 12 août 2005, 09:45
par Elie
Posté : 12 août 2005, 09:51
par cerber
oui, mais :
- il faut avoir un client connecté au site lors de l'exécution des boucles
- il faut que ta position dans les boucle soit prévisible ou alors qu'on puisse sauvegarder l'état des boucles
ensuite c'est qu'une histoire de javascript
J'ai le bout de code si il faut
Posté : 12 août 2005, 11:33
par HD
et ca dit
Notez que set_time_limit() n'a pas d'effet lorsque PHP fonctionne en mode safe mode. Il n'y a pas d'autre solution que de changer de mode, ou de modifier la durée maximale d'exécution dans le php.ini.
c'est comment chez la majorité des hebergeurs ?
pour cerber : à la fin de chaque boucle $id est augmentee de 1 donc on peut savoir où on s'est arreté. reste à savoir ce qu'il faut faire apres pour reprendre la boucle en evitant le probleme de temps
ps: si je fais un include, le "chrono" repart à 0 ou continue ?
Posté : 12 août 2005, 11:56
par cerber
il continue, sinon ce serait trop simple

En fait cette sécurité permet au serveur de ne pas se focaliser sur un client
=>
solution :
<?
//.... ton code de boucle .....
$id= isset($_GET['id'])?$_GET['id']+1:1;
?><html>
<head></head>
<body>
<script language="javascript">
window.location = '<?=$_SERVER['PHP_SELF']."?id=$id"?>';
</script>
</body>
</html>
Posté : 12 août 2005, 12:57
par HD
stp tu peux commenter
$id= isset($_GET['id'])?$_GET['id']+1:1;
et
window.location = '<?=$_SERVER['PHP_SELF']."?id=$id"?>';
mci
Posté : 12 août 2005, 13:11
par cerber
$id= isset($_GET['id'])?$_GET['id']+1:1;
ben là c'est un truc bidon pour calculer le nouvel ID
window.location = '<?=$_SERVER['PHP_SELF']."?id=$id"?>';
et là c'est un morceau de code qui va recharger la page en lui passant le nouvel ID calculé plus haut
=> quand tu réceptionne la page t'a qu'a regarder l'ID pour savoir où il faut continuer
Dans mon idée, tu n'a plus de boucle, mais tant que tu as des traitements à effectuer tu affiche le bout de code qui recharge la page => tu as 30 secondes pour chaque itération puisque le serveur voit chaque itération comme une nouvelle page
Posté : 12 août 2005, 22:14
par HD
ok merci bcp
je te tiens au courant...
Posté : 12 août 2005, 23:07
par HD
ca marche pas
1
284.30
Fatal error: Maximum execution time of 30 seconds exceeded in c:\program files\easyphp\www\projet1\bourse\03_majcours.php on line 37
pourtant le programme a affiché des donnees qui ne sont calculées qu'à la 66eme ligne (284.30)
=> il a donc deja bouclé la 1ere boucle (le 1 affiché est le id actuel)
=> il n a donc pas rechargé la page
ce que j'avais fait :
<? (...) while ($id<$nbr) { ... }
?>
<html>window.location = '<?=$_SERVER['PHP_SELF']."?id=$id" // recharger page avec nouvel ID
?>';</html>

Posté : 13 août 2005, 12:02
par cerber
fait attention, il ne faut pas tenter plusieurs bouclees en un chargement
ou alors c'est que le probleme est plus grave : un chargement prend plus d'une boucle
Posté : 13 août 2005, 12:34
par HD
ah je viens de remarquer que... j'ai mis le window.location apres le fin du while !!!

c'est pour ca qu'il n'a pas rechargé la page
allez je reteste ca...
Posté : 14 août 2005, 02:56
par HD
c'est bon ca marche ! merci bcp
PLus simple !
Posté : 24 août 2005, 10:45
par guigui
Il faut juste modofier la variable max_execution_time du fichier php.ini qui est initialement a 30s. En mettant 0 le temps max d'écution devient illimité.