Maximum execution time out ....

Messages postés
24
Date d'inscription
samedi 21 juin 2003
Statut
Membre
Dernière intervention
24 mars 2008
- - Dernière réponse : franc666
Messages postés
3
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
26 janvier 2006
- 26 janv. 2006 à 00:46
Bonjour tout le monde,

J'ai fait des recherches sur le sujet mais rien trouvé de très concret ...

lors de l'envoie d'une newsletter je reçois le message d'erreur decrit dans le titre ...

je sais que c'est le delai imparti pour l'execution du script cote server ...
le probleme, c'est qu'il faut que j'envoie ces mails ...

je recupere selon le choix de l'admin (groupe et / ou utilisateur seul) les adresses mail dans un tableau, sur lequel j'effectue
soit un foreach
soit un while

dans les deux cas j'envoie le mail dans la boucle mais trop long je depasse le temps permis par le serveur ...
J'ai lu qu'on pouvait utiliser set_time_limit() mais tout les serveurs ne le permettent pas ...

Comment puis je procéder ?
Merci d'avance.
Afficher la suite 

13 réponses

Messages postés
1218
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
18 octobre 2012
4
0
Merci
dans phpini , tu peux modifier le parametre (en secondes)

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30 ; Maximum execution time of each script, in seconds
Commenter la réponse de sidf
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
0
Merci
Ou alors tu fais de l'envoi groupé (genre 1 à 100, 101 à 200 etc... )
Commenter la réponse de FhX
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
On peut aussi utiliser la bufferisation de sortie. Y a un exemple sympa (à retravailler) sur php.net, ça doit être dans ob_flush() ou dans ce coin-là en tous cas.
Commenter la réponse de malalam
Messages postés
24
Date d'inscription
samedi 21 juin 2003
Statut
Membre
Dernière intervention
24 mars 2008
0
Merci
sidf -> si tu n'as pas accès au php.ini c'est la panade ...

FhX -> j'ai lu pas mal de truc sur ce moyen de faire, mon probleme a ce niveau c'est que je ne sais pas du tout comment recharger la page apres l'envoie des 100 premiers mail pour ensuite envoiyer les 100 suivant ....

malalam -> j'ai essaye flush() et ob_flush() -> marche pas ... ou alors m'y suis mal pris ...
Commenter la réponse de DrAgOnLORdS
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
0
Merci
Salut,

Malalam > ça fonctionnera pas mieux la bufferisation :-( c'est la fonction mail() qui bride ici (ou plutôt le serveur smtp).

En gros t'es obligé de : mettre le max_execution_time à zéro ou alors de passer par un envoi de paquets de mails (100 par exemple). Pour faire ça il te faut un id unique sur ta table ou alors un champ supplémentaire qui indiquera si oui ou non le mail est envoyé (un peu moins optimisé surtout si ta table n'a a beaucoup d'enregistrements).

Bref lorsque tu actualises (ça se fait automatiquement en php via un header('location:....) ou encore un header('refresh...

bref en input type="hidden" tu mets l'id de départ et d'arrivée, lorsque les mails sont envoyés tu incrémentes de 100 ces id et ça te donne les 100 prochains id à sélectionner (enfin la plage d'id). Et hop c'est torché ensuite.

a +

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Commenter la réponse de cs_Anthomicro
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
0
Merci
n'a a => n'a pas

désolé.

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Commenter la réponse de cs_Anthomicro
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
0
Merci
J'avais émis la solution il y a longtemps.
Il faut faire quelque chose de très simple à base de sessions par exemple couplé avec du passage par url :)

Une petite recherche sur le forum et tu trouveras un vieux code à moi. J'ai la flemme de le chercher voila pourquoi !
Commenter la réponse de FhX
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
sisi, avec la bufferisation c'est faisable : faut envoyer un caractère à la sortie tous les x mails. Un peu comme une barre de progress, quoi.
mais l'envoi groupé est aussi bien hein lol.
Commenter la réponse de malalam
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
0
Merci
Oui ça ok, mais ça n'empêchera pas le max_execution_timeout quand t'envoie trop de mails :-)

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Commenter la réponse de cs_Anthomicro
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Bah non, évidemment, faut boucler sur l'envoi et la sortie.
Commenter la réponse de malalam
Messages postés
24
Date d'inscription
samedi 21 juin 2003
Statut
Membre
Dernière intervention
24 mars 2008
0
Merci
existe t il une source simple et efficace pour eviter ce timeout ?

J'ai regarde sur le forum FhX mais euh bon, plus de 1000 msg ... chaud de retrouver ta source la dedans
Commenter la réponse de DrAgOnLORdS
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
0
Merci
étapes à suivre :

afficher le formulaire une première fois, ensuite tu rentres tes infos que tu gardes en session par exemple, et tu fais des refresh en indiquant en session l'id de départ et d'arrivée, que tu incrémenteras à chaque refresh du nombre de messages envoyés.

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Commenter la réponse de cs_Anthomicro
Messages postés
3
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
26 janvier 2006
0
Merci
Yop !

J'ai déjà eu le soucis

Voici ce que j'ai fais

J'ai une premiere page qui contient les infos de la newsletter à envoyer (l'admin choisi les options de la newsletter donc)

Ensuite quand il soumet la requête :
- creation d'une table avec le contenu de la requête que l'on nommera "temp_news"
- creation d'une table avec les paramètres de la newsletter (par exemple : le header from, le header reply-to, nombre total de lignes, nombre d'email à traiter par envoi (50 ou 100 c'est bien mais ça depend aussi de la taille de l'envoi)... etc) que l'on nommera "temp_param"
- ouverture du script php qui va envoyer les emails (dans un popup, dans une autre page, dans un iframe ou meme dans la meme page mais c'est pas du joli !)

Ce qui se passe dans le fichier qui envoye les emails :
1) On fait une requête sur les tables "temp_param" pour récupérer les paramètres de la newsletter et "temp_news" que l'on vient de créer qui va recuperer x lignes (définit par le nombre d'email à traiter par envoi) de la table (on utilise LIMIT pour ça bien sur)
2) Là on envoye l'e-mail défini dans la table dans le champ email (par exemple) pour chaque ligne,
3) Ensuite on efface les x lignes à qui on a envoyé les emails...
4) Là on rafraichit la page

Le script va maintenant repeter le processus indéfiniment...
Bien sur il faut qu'il s'arrete ! Il faut simplement mettre une condition au rafraichissement de la page
Par exemple un petit SELECT COUNT(*) ? et si le resultat de cette requête vaut 0 alors le processus d'envoi est terminée on n'a plus qu'a afficher un message "Bravo tout est envoyé" et surtout aussi on supprime les 2 tables qu'on a crée, puisqu'on a terminé l'envoi...


Voilà comment segmenter un envoi d'email en masse sans se prendre la tete pour savoir si le script fonctionne sur tel ou tel serveur...
Je vous conseille aussi de supprimer ligne par ligne (meme si ça bouffe plus de ressources) comme ça si la connexion plante il suffit de relancer le script d'envoi pour reprendre l'envoi où il en était sans avoir perdu d'email et sans envoyer 2 fois le meme email à quelqu'un...

Tchuss

FuR[i]OuS
Commenter la réponse de franc666