Très grosse boucle en php

  • Auteur de la discussion Auteur de la discussion dadovb
  • Date de début Date de début
WRInaute passionné
Bonjour à tous !

J'avais posté hier à propos d'un script de mailing sur 120000 entrées dans ma base, il est tout simple :

Code:
require "./database.php";

  $query = "SELECT * FROM mailing"; 
  $result= MYSQL_QUERY($query); 
       if(mysql_error())
        { print "Erreur dans la base de données : ".mysql_error();
           print "<br>Importation stoppée.";
           exit();
		   
        }
	$nb_emails	= mysql_num_rows($result);
	echo "<br> nb mails envoyés : $nb_emails <br>";

	for($i=0;$i<$nb_emails;$i++){
		
		$email	= mysql_result($result,$i,'email');
	
		//mail($email,$sujet,$message,$headers);
	
		echo "<br> $i : mail envoyé à $email";

Mon script s'arrete à 23583 tours, j'ai le mail() en commentaires, je voulais tester d'abord si mon script bouclait bien sur toutes mes entrées (g bien fait :P )

Il me laisse ca comme trace :
nb mails envoyés : 128201

0 : mail envoyé à truc@rediffmail.com
1 : mail envoyé à machin@hotmail.com

....

23583 : mail envoyé à chose@yahoo.com

Voilà, je comprends pas pourquoi il arrive pas à finir sa boucle surtout qu'au niveau processeur mon serveur se porte bien durant la boucle. Peut-etre avez-vous une idée sur la question ?
 
WRInaute passionné
arf, en fait ca sarrete pas tjrs pile au meme moment : 23583, 23556, 23522 et mdr, en fait mon occupation CPU est à + de 90%...
 
WRInaute occasionnel
ne me dis pas que tu veux faire une boucle sur 120.000 envois d'email ?
D'une, ca passera pas, et de 2, mieux vaut faire un champ dans ta table dès que t'envoies un email...
 
WRInaute impliqué
dans l'url de ton script, ajoute un p'tit parametre d'url ayant une valeur x

ensuite, tu fais un script qui dis


si !isset valeur x alors x=0

ensuite, tu fait un select de tes mails dans ta base de avec un limit 0,valeur x

tu boucle sur les resultats selectionné avec a chaque fois la fonction mail

puis tu ajoute un meta refresh avant ta boucle = 30 seconde (histoire de dire que ta boucle ai le temps de se finir, et tu fais refresher ta page sur la page courante et le parametre d'url X=X+200 par exemple


Ainsi, tu n'aura plus qu'a lancer ton script, et a aller faire un tour
 
WRInaute impliqué
petit-ourson a dit:
Et ca met combien de temps pour envoyer 120 000 mails ?

par lot de 200 avec un meta refresh à 30 secondes:

cela met (120000/200)*30 secondes :lol:

bon c'est long, mais une boucle de 200 enregistrement avec a chaque fois l'envoie d'un mail ça necessite p'tet pas 30 secondes, faut adapter, je ne vais pas lui prendre la main


perso un mailing de 120 000 mail sur un dédié, je penses que ça doit pouvoir se gérer en 1h30 si on ne veux pas trop saturer le serveur

edit: et encore 1h30 c'est super rapide il me semble pour 120 000 mails
 
WRInaute impliqué
STFprod a dit:
Pour peu qu'il doive ajouter une pièce jointe de 500ko dans chaque email ;)

Et alors avec ma méthode c'est bon non?

Au pire pour régler le meta refresh, on fais un teste avec un timer et une boucle sur 20 fois
 
WRInaute impliqué
Zim' a dit:
dans l'url de ton script, ajoute un p'tit parametre d'url ayant une valeur x

ensuite, tu fais un script qui dis


si !isset valeur x alors x=0

ensuite, tu fait un select de tes mails dans ta base de avec un limit 0,valeur x

tu boucle sur les resultats selectionné avec a chaque fois la fonction mail

puis tu ajoute un meta refresh avant ta boucle = 30 seconde (histoire de dire que ta boucle ai le temps de se finir, et tu fais refresher ta page sur la page courante et le parametre d'url X=X+200 par exemple


Ainsi, tu n'aura plus qu'a lancer ton script, et a aller faire un tour
Moi je préfère la méthode 'barbare'

Un select unique qui alimente un tableau et après le mail est envoyé en bouclant sur le tableau plutot que sur la requête.

Le truc super important en fait, c'est de ne pas faire un echo à chaque boucle, c'est cela qui bouffe du tps ;o)
 
WRInaute occasionnel
oui ca marchera, s'il n'y a pas de souci.

le probleme de ta solution étant que s'il y a un plantage a un endroit, on ne sait pas où... (coupure de courant ou plantage ou time limit exceeded, ...)

il faut toujours stocker quels emails ont été envoyés, et lesquels n'ont pas fonctionné.
 
WRInaute impliqué
Zim' a dit:
petit-ourson a dit:
Et ca met combien de temps pour envoyer 120 000 mails ?

perso un mailing de 120 000 mail sur un dédié, je penses que ça doit pouvoir se gérer en 1h30 si on ne veux pas trop saturer le serveur

edit: et encore 1h30 c'est super rapide il me semble pour 120 000 mails

Pouaa c'est une chèvre mon serveur, il a mis 3h30 hier pour m'envoyer mes 15 000 mails.

Le script a mis 12 mins (requête + envoi via mail()) et qmail a mis 3h15 a tout digérer. Va falloir qu'il embauche un admin réseau dans cette boite lol
 
WRInaute accro
petit-ourson a dit:
Pouaa c'est une chèvre mon serveur, il a mis 3h30 hier pour m'envoyer mes 15 000 mails.

Le script a mis 12 mins (requête + envoi via mail()) et qmail a mis 3h15 a tout digérer. Va falloir qu'il embauche un admin réseau dans cette boite lol
Oui, enfin il faut surtout faire des scripts qui tiennent la route et ne pas s'improviser programmeur !
 
WRInaute occasionnel
en lançant la fonction sleep (de 20 secondes par exemple) tous les 100 passages de la boucle, ça irait pas ?
Ca permettrait d'exécuter le script complet (bien vérifier le set_time_limit) et ferait des petites pauses pour le CPU.
 
WRInaute impliqué
thierry8 a dit:
petit-ourson a dit:
Pouaa c'est une chèvre mon serveur, il a mis 3h30 hier pour m'envoyer mes 15 000 mails.

Le script a mis 12 mins (requête + envoi via mail()) et qmail a mis 3h15 a tout digérer. Va falloir qu'il embauche un admin réseau dans cette boite lol
Oui, enfin il faut surtout faire des scripts qui tiennent la route et ne pas s'improviser programmeur !

oui on peut aussi dire cela lol
 
Discussions similaires
Haut