time-out en php

JeromeRookie
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 462
Inscription: 11 Aoû 2003

time-out en php

Message le Dim Nov 18, 2007 10:06

Bonjour,
j'ai un script php qui dure très longtemps car il traite plus de 40.000 lignes d'un fichier XML et intègre dans mysql des produits (tout en redimensionnant des images).
il tourne donc plus de 30s.
j'ai ce message d'erreur :

Fatal error: Maximum execution time of 30 seconds exceeded in ...

j'ai essayé set_time_limit(0); mais je n'ai pas accès à cette fonction en safe-mode.

j'ai également essayé ini_set('max_execution_time',100); mais cela semble ne rien y faire car la limite reste à 30s....


quelqu'un a-t-il une idée ?
Merci


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1543
Inscription: 11 Mai 2005

Message le Dim Nov 18, 2007 13:11

Dans le fichier php.ini, tu as une ligne :
max_execution_time = 30

Par contre, si tu es en mutualisé, je pense pas (et même j'espère) que tu ne peux pas changer ce parametre.

applebuelos
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 1
Inscription: 15 Aoû 2006

Message le Dim Nov 18, 2007 13:18

ou au debut de ton fichier .php :

tu ecris : set_time_limite('duree de l execution de ton script en secondes');

JeromeRookie
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 462
Inscription: 11 Aoû 2003

Message le Dim Nov 18, 2007 13:23

applebuelos a écrit:ou au debut de ton fichier .php :

tu ecris : set_time_limite('duree de l execution de ton script en secondes');


comme je le disais dans mon post précédent, j'obtiens un message d'erreur lorsque je fais cela me disant que je ne peut pas modifier ce paramètre en safe-mode...


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1543
Inscription: 11 Mai 2005

Message le Dim Nov 18, 2007 13:27

JeromeRookie a écrit:comme je le disais dans mon post précédent, j'obtiens un message d'erreur lorsque je fais cela me disant que je ne peut pas modifier ce paramètre en safe-mode...


Voir les explications dans http://www.php.net/set_time_limit :
"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."

JeromeRookie
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 462
Inscription: 11 Aoû 2003

Message le Dim Nov 18, 2007 13:33

j'ai accès à mon root et essaie de modifier mon fichier php.ini.
j'ai deux fichiers php.ini, l'un dans etc/php5/cli/, l'autre dans etc/php5/apache/

savez vous lequel doit etre modifié ?
j'ai modifié les deux avec une fois max_execution_time=35 et une autre fois max_execution_time=40, afin de le savoir mais lorsque je relance mon script, j'ai toutjours un time-out après 30s????

faut-il redémarrer le serveur apache pour que cette modif soit prise en compte ?
si oui comment faire ?


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1543
Inscription: 11 Mai 2005

Message le Dim Nov 18, 2007 13:43

Voir http://php.developpez.com/faq/?page=ini (j'ai bien le droit de faire un lien ?)

Pour redémarrer apache : /etc/init.d/apache restart

JeromeRookie
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 462
Inscription: 11 Aoû 2003

Message le Dim Nov 18, 2007 13:56

merci pour ces explications.
j'ai donc pu isoler mon fichier php.ini et tester les deux pistes pour résoudre mon problème :

piste 1 : set_time_limit(0);
cette commande donne une erreur (Warning: set_time_limit() [function.set-time-limit]: Cannot set time limit in safe mode in...) alors que j'ai safe_mode = Off dans mon php.ini

Piste 2 : modifier max_execution_time = 200 dans php.ini
j'ai toujours l'erreur Fatal error: Maximum execution time of 30 seconds exceeded in ...
ce qui est étonnant, c'est que l'erreur affiche toujours 30s ...


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1543
Inscription: 11 Mai 2005

Message le Dim Nov 18, 2007 14:08

En utilisant phpinfo() en php, ça doit te dire plein de chose : si tu es ou n'est pas en safe mode, la valeur de max_execution_time, l'emplacement du fichier ini, .... A vérifier pour voir s'il prend bien en compte ton fichier.
Il me semble pas qu'il faut faire autre chose que mettre safe mode à Off pour le désactiver .... mais j'y ai jamais touché. Idem pour la durée d'execution : c'est quand même une sécurité d'avoir une limitation du temps, donc je laisse :-)
Quand j'ai des scripts de plus de 30 secondes, je les coupes en morceau ; tu dois pouvoir le faire en comptant le temps au fur et a mesure du traitement de ton fichier, et quand tu vas atteindre les 30 secondes, tu mémorise ou tu en ai ... et tu recommence.

JeromeRookie
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 462
Inscription: 11 Aoû 2003

Message le Dim Nov 18, 2007 14:12

là, il faudrait vraiment que je le coupe en 100 car il y en a pour 30minutes environ ...

j'ai refais un phpinfo et je trouve que le safe_mode est à On pour la local value et à Off pour la master value


cthierry
WRInaute passionné
WRInaute passionné
 
Messages: 2466
Inscription: 15 Jan 2005

Message le Dim Nov 18, 2007 14:14

+ 1 avec arnaudmn

Pourquoi ne pas tout simplement decouper ton script php en plusieurs étapes.
C'est ce que je fais pour récupérer des gros flux et les mettres en bdd. Cela évite ce genre de problème.

Mais bon c'est juste un avis.

JeromeRookie
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 462
Inscription: 11 Aoû 2003

Message le Dim Nov 18, 2007 14:17

votre avis m'intéresse mais je ne vois pas un moyen simple de le faire. j'intègre un catalogue xml d'une plateforme d'affiliation. ce catlogue est énorme il faudrait que je le découpe en 50...

faire cela à la main me parait un peu laborieux... mais peut-etre me manque-t-il des compétences...


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1543
Inscription: 11 Mai 2005

Message le Dim Nov 18, 2007 14:50

JeromeRookie a écrit:votre avis m'intéresse mais je ne vois pas un moyen simple de le faire. j'intègre un catalogue xml d'une plateforme d'affiliation. ce catlogue est énorme il faudrait que je le découpe en 50...

faire cela à la main me parait un peu laborieux...


On ne parle pas de le faire a la main :-) Suffit de traiter ton fichier comme tu le fais aujourd'hui, mais en regardant le temps écoulé. Quand tu vas atteindre 30 secondes, tu recharges ta page avec un paramétre qui t'indique ou tu en es (simplement la position dans le fichier, avec ftell() ), et tu recommences depuis cette position.
En générant du javascript ou l'entete Refresh par exemple quand la limite des 30 secondes va être atteinte ... ou en mettant un lien pour continuer le traitement.

JeromeRookie
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 462
Inscription: 11 Aoû 2003

Message le Dim Nov 18, 2007 15:20

oulah... là ca dépasse mes compétences... j'ai bien compris le principe que tu expliques.
je sais mesurer le temps et enclencher une action dès que les 25s sont dépassées mais je ne sais pas :
- utiliser ftell
- rappeler la meme page sans qu'il y ait un clic
- commencer dans le fichier xml là ou je m'étais arreté...

as-tu par hasard un exemple de fichier ?


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1543
Inscription: 11 Mai 2005

Message le Dim Nov 18, 2007 15:28

JeromeRookie a écrit:oulah... là ca dépasse mes compétences... j'ai bien compris le principe que tu expliques.
je sais mesurer le temps et enclencher une action dès que les 25s sont dépassées mais je ne sais pas :
- utiliser ftell


http://www.manuelphp.com/php/function.ftell.php :-)

JeromeRookie a écrit:- rappeler la meme page sans qu'il y ait un clic


Quand tu atteind 25 secondes, tu fais ça :
$iPositionDansLeFichier = ftell($tonfichier);
$url='http://mondomaine.com/';
header("Refresh: 1;url=http://tondomaine/tapage?position=".$iPositionDansLeFichier);

JeromeRookie a écrit:- commencer dans le fichier xml là ou je m'étais arreté...


Juste après avoir ouvert ton fichier (avec fopen ?), tu te positionnes avec fseek($tonfichier, $HTTP_GET_VARS["position"])

Maintenant, je sens que tu vas me dire que tu utilises un script tout fait pour traiter ton fichier xml ... 8)

time-out en php

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités