|
 Posté le 07/02/2007 @ 19:38 |
Petit astucien
| Bonsoir à toutes et à tous, Voici ma question, je viens de faire un petit espace membre, avec une fonction d'envoie de messages privés. Le truc c'est que quand je veux envoyer un message à tous les membres et que tous les membres recoivent un mail, ben ma fonction bloquent au bout de 30 sec. Voici le message : Fatal error: Maximum execution time of 30 seconds exceeded in h:\weblocal\membre\mail_membre_ce.php on line 183 Voici mon code : <? $req = MYSQL_QUERY("SELECT * FROM gestion_membre WHERE ce='oui'"); $res = MYSQL_NUM_ROWS($req); $i=0; WHILE($i!=$res) { $mel = mysql_result($req,$i,"mel"); $nom = mysql_result($req,$i,"nom"); $prenom = mysql_result($req,$i,"prenom"); ?> <? $headers = "From: "."mon mail"; $titre = "Message privé dans ton espace membre"; $corps_message = ("Bonjour $prenom $nom, \n\nTu viens de recevoir un mail de $expediteur, tu peux allez le consulter dans ton espace membre."); $message = ($corps_message); if(mail($mel,$titre,$message,$headers)){ ?> <? $i++; } ?> <span class=info>Le mél est en cours d'envoie...</span> <?php } } ?>
Le mail est envoyé mais au bout de 30 secondes il s'arrête. Comment faire pour ne pas avoir de Maximum execution time of 30 seconds exceeded et donc ralentir l'envoie. En faite faire faire une pause à chaque boucle de 1 seconde par exemple. En fait c'est peut-être autre chose !!! Alors si vous pouviez m'apporter vos avis, je vous en remercie d'avance. Bean
|
|
|
|
|
|
Posté le 07/02/2007 à 19:42 |
Grande Maîtresse astucienne | Un revenant! 
|
|
Posté le 07/02/2007 à 19:48 |
Petit astucien
| Coucou Elle, Et oui !!! Enfin j'étais jamais bien loin.... même si ma participation a été moindre depuis qq temps. Mais j'ai trop de site !!!!!! lol Alors que penses-tu de mon pb ? |
|
Posté le 07/02/2007 à 19:51 |
Grande Maîtresse astucienne | Bean a écrit :
Alors que penses-tu de mon pb ?
Euh... pas grand chose. PHP et moi, ça fait deux.  |
|
Posté le 07/02/2007 à 20:34 |
Astucien | Salut :) en fait la solution est aussi simple que compliquée ... simple parce que le temps maximum d'exécution se modifie dans le fichier php.ini et est par défaut à 30 secondes. Compliquée parce qu'à part hé"berger Apache sur ton pc ou bien louer un serveur dédié, tu n'as pas accès au php.ini et tu ne peux donc pas modifier ceci ... Solution : envoyer un mail à plusieurs adresses en caché, ce que j'ai utilisé dans la première version de mon script "NewsletTux" ou répéter récursivement l'envoi de mail ... De façon à déjouer l'exécution d'un thread en 30 secondes (ce que je suis en train de viser pour la version 2 ...) EDIT : ton code est perfectible et allégeable, voici un aperçu perso d'un début d'optimisation (après, on pourrait ss doute faire encore mieux, mais ce serait capillotracté) : <?php $req = mysql_query("SELECT * FROM gestion_membre WHERE ce='oui'"); while($abonne = mysql_fetch_array($req)) { $mel = $abonne['mel']; $nom = $abonne['nom']; $prenom = $abonne['prenom']; $headers = "From: "."mon mail"; $titre = "Message privé dans ton espace membre";
$corps_message = ("Bonjour $prenom $nom, \n\nTu viens de recevoir un mail de $expediteur, tu peux aller le consulter dans ton espace membre.");
if(mail($mel,$titre,$corps_message,$headers)) { echo "<span class=\"info\">Le mél est envoyé...</span>\n"; } } ?> Modifié par Malcolm le 07/02/2007 20:39 |
|
Posté le 07/02/2007 à 21:04 |
Petit astucien
| Salut Malcolm, Heureux de te voir après ce long silence de ma part... désolé. Que veux tu dire par : ? ou répéter récursivement l'envoi de mail
Mais surtout comment faire cela ?
|
|
Posté le 07/02/2007 à 21:23 |
Petit astucien
| Re, Comment fais-tu ? envoyer un mail à plusieurs adresses en caché Merci !! |
|
Posté le 07/02/2007 à 21:24 |
Astucien | en gros, il s'agirait d'utiliser une page php qui fait 2 actions : - l'envoi du mail
- l'appel à elle-même (principe-même de la récursivité
) sous une condition évidemment (pour éviter les boucles infinies)
et je suis encore en train d'étudier cela ... Modifié par Malcolm le 07/02/2007 21:24 |
|
Posté le 07/02/2007 à 21:25 |
Petit astucien
| Je pense que j'ai trouvé !!! - Cc: : cet en-tête permet de spécifier les autres destinataires qui recevront le mail en Cc (Carbon copy), c'est à dire que tous les destinataires pourront voir à qui le message a été transmis.
On l'utilise comme ceci : Cc: email1,email2,email3... - Bcc: : cet en-tête permet de spécifier les autres destinataires qui recevront le mail en Bcc (Blind carbon copy), c'est à dire que les destinataires ne pourront pas voir à qui le message a été transmis, il s'agit d'une copie cachée.
On l'utilise comme ceci : Bcc: email1,email2,email3...
La source http://www.vulgarisation-informatique.com/mail.php Modifié par Bean le 07/02/2007 21:28 |
|
|
|
|
|
Posté le 07/02/2007 à 21:53 |
Petit astucien
| Malcolm je bloque sur l'envoie en Bcc. Je n'arrive pas dans ma boucle a faire une liste de mes mel pour pouvoir les envoyer ensuite dans une 2ème partie dans la fonction mail. <? $req = MYSQL_QUERY("SELECT * FROM gestion_membre WHERE ce='oui'"); $res = MYSQL_NUM_ROWS($req); $i=0; WHILE($i!=$res) { $mel = mysql_result($req,$i,"mel"); $nom = mysql_result($req,$i,"nom"); $prenom = mysql_result($req,$i,"prenom"); ?> Ici une fonction pour faire mes mails dans une variable <? $i++; } ?>
Et après j'envoie mon mail <? $headers = "From: "."snadgicgt24@free.fr"; $headers="Bcc: [mel=$mel]\n"; $titre = "Message privé dans ton espace membre";
$corps_message = ("Bonjour $prenom $nom, \n\nTu viens de recevoir un mail de $expediteur, tu peux allez le consulter dans ton espace membre.");
$message = ($corps_message); if(mail($mel,$titre,$message,$headers)){ ?> <span class=info>Le mél est en cours d'envoie...</span>
Mais comment créer cette liste de mail ? je vois po :( |
|
Posté le 07/02/2007 à 23:02 |
Astucien | si tu fais un mail personnalisé, ça risque de ne pas coller sur le contenu, vu que les gens auront tous le même ... Autrement avec ma structure je testerais quelque chose ressemblant à ça : <?php /* ----- config ----- */ $nb_adresses_parmail = 10; // à changer selon les besoins /* ----- fin config ----- */
$req = mysql_query("SELECT * FROM gestion_membre WHERE ce='oui'"); $array_abonnes = array(); $i = 0; $emails_bcc = '';
while($abonne = mysql_fetch_array($req)) { $array_abonnes[$i]['mel'] = $abonne['mel']; $array_abonnes[$i]['nom'] = $abonne['nom']; $array_abonnes[$i]['prenom'] = $abonne['prenom']; $i++; }
// puis on génère le mail, par passe de XXX adresses $nb_passes = ceil(count($array_abonnes) / $nb_adresses_parmail);
for($a = 0; $a < $nb_passes; $a++) { // lecture des emails for ($b = 0; $b < $nb_adresses_parmail; $b++) { $mails_bcc .= $array_abonnes[$a * $b]['mel'].";"; } // On supprime le dernier point virgule $mails_bcc .= '@@'; $mails_bcc = str_replace(';@@';'',$mails_bcc); $headers = "From: "."mon mail"; $titre = "Message privé dans ton espace membre"; $corps_message = ("Bonjour $prenom $nom, \n\nTu viens de recevoir un mail de $expediteur, tu peux aller le consulter dans ton espace membre."); if(mail($mel,$titre,$corps_message,$headers)) { echo "<span class=\"info\">Le mél est envoyé...</span>\n"; } } // fin de la passe ?>
bon, c'est à vue d'oeil, et je n'ai pas d'exemple pour tester sous la main ... |
|
Posté le 07/02/2007 à 23:03 |
Astucien | j'ai oublié, mais évidemment tu modifies les headers en mettant les $mails_bcc ...  |
|
Posté le 08/02/2007 à 10:12 |
Petit astucien
| Merci Malcolm, Trop fort ton script !!!!! Il marche au poil. Enfin j'espère que le mel est envoyé à tout le monde !!!! De tout j'aurais des remontées sinon !!!!! Pour la ligne manquante : $headers="Bcc: $mails_bcc\n"; |
|