time-out en php

WRInaute occasionnel
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
 
WRInaute passionné
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.
 
WRInaute occasionnel
applebuelos a dit:
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...
 
WRInaute passionné
JeromeRookie a dit:
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."
 
WRInaute occasionnel
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 ?
 
WRInaute occasionnel
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 ...
 
WRInaute passionné
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.
 
WRInaute occasionnel
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
 
WRInaute accro
+ 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.
 
WRInaute occasionnel
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...
 
WRInaute passionné
JeromeRookie a dit:
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.
 
WRInaute occasionnel
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 ?
 
WRInaute passionné
JeromeRookie a dit:
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 dit:
- 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 dit:
- 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)
 
WRInaute occasionnel
non non, j'utilise un script développé par moi. c'est bien là le problème ;-)
j'utilise la bibliothèque de php5 simpleload_xml.
je teste ce que tu m'as conseillé demain soir car je n'ai plus accès à mon code.
merci beaucoup pour tes conseils en tous cas et bonne soirée à toi ;-)
 
WRInaute impliqué
JeromeRookie a dit:
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 ?

safe_mode = Off
dans le php.ini de ton phpinfo
puis redémarrage d'apache
c'est quoi ton système ?

pourquoi sinon ne pas lancer ton script en ligne de commande, tu serais tranquille
 
WRInaute impliqué
php tonphp.php
ensuite tu as des options pour spécifier un php.ini propre à l'exécution
php --help
s'il n'est pas dans le path
locate php
 
Nouveau WRInaute
Re:

arnaudmn a dit:
JeromeRookie a dit:
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 dit:
- 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 dit:
- 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)


Déterrage, mais merci beaucoup pour cette idée, tu me sauves ;)
 
Discussions similaires
Haut