Faire des "pauses" dans un script php

WRInaute impliqué
Salut tout le monde,

Je sais qu'on en avais parlé sur le chat un soir, mais je sais plus du tout

Je suis en php4, et je voudrais faire un truc qui envoie un mail.

Pour le moment, j'aimerai que ça gere au moins l'envoie de 2500 mails à la suite max.

Vous pensez quoi? Si je boucle à la barbare sur les mails, ça passe?

Sinon, et par sécurité, j'aimerai bien les envoyer par lot de 250/500 sans qu'il y ai besoin d'intervention ni rien, donc faire des pause durant l'execution du script php?

Ensuite, si vous pouvez m'indiquer la méthode pour allonger le timeout d'un script php, ce serais cool.

Donc voila, merci d'avance pour ceux qui saurons m'aider :)

PS: autre question,

Si dans un script j'update ma bdd à unchamp=1, que je fais des opération, et que apres je fais un update a unchamp=1 (a chaque fois sur tous les enregistrements), entre les deux requetes SQL, j'ai bien les bonnes valeur dans ma bdd? (je suppose que oui mais bon)
 
WRInaute accro
Zim' a dit:
Ensuite, si vous pouvez m'indiquer la méthode pour allonger le timeout d'un script php, ce serais cool.
Code:
set_time_limit(60000); //fixe un delai maximum d'execution de 600 secondes soit 10 minutes.
:wink:
 
WRInaute accro
Tu as un dédié ?

si c'est le cas un petit cron qui lance un script php, qui lui même fait:

- récupération de toute la liste de mail + info perso.
- une boucle qui traite message par message
- dans la boucle pour chaque mail: un set_time_limit(20);
(20 seconde pour traiter chaque mail..largement suffisant)
- tous les 100 mails traités une pause d'une minute par exemple (sleep(60);)
- ne pas oublier devant le sleep(60) un set_time_limit(80);

Ainsi 3000 mails seront traité en 30 minutes (~) sans surcharge serveur.

Après tu peu adapter le tout (temps d'attente,nombre de mail envoyé par packet, etc..)
 
WRInaute discret
thierry8 a dit:
Tu as un dédié ?

euh, sur un dédié chez ovh, je crachais 120 000 mails à l'heure
y'a pas de soucis, pourquoi faire une pause pour 2000 mails .. tu balances le tout ... avec un long script php, mais en local (tu mets un smtp local, genre postfix) ... et apres, c'est postfixqui mettra du tempsà tout envoyer
 
Nouveau WRInaute
bonjour, j'ai le meme probleme

j'apelle à partir d'une boucle des mails d'une base de donnée, que j'envoie, seulement j'ai un fichier de pres de 7000 mails,
j'ai serveur smtp privé,

j'ai ce code

Code:
for ($i=1;$i<$nb;$i++){
  $o=mysql_fetch_object($result_mail);
   $recipient=$o->news_mail;

    if (isset($_POST['select'.$i.''] )){	//si la checkbox du mail est selectionnée    			
           $mail =& Mail::factory("smtp", $smtp_params); 
           $result = $mail->send($recipient, $headers, $body);  //envoi du mail
    }
 }

donc di j'ai bien compris la reponse de thierry8

il faudrait que je rajoute:

Code:
for ($i=1;$i<$nb;$i++){
    $o=mysql_fetch_object($result_mail);
    $recipient=$o->news_mail;
		
       if (isset($_POST['select'.$i.''] )){	//si la checkbox du mail est selectionnée    	
          $mail =& Mail::factory("smtp", $smtp_params); 
         $result = $mail->send($recipient, $headers, $body);  //envoi du mail
         set_time_limit(20); 
       }
}

je ne suis pas tres exellent en requete sql, comment faire pour envoyer tous les 100 mails traités une pause d'une minute ???

merci d'avance pour votre aide
 
WRInaute discret
Bonjour
Voici un exemple de comment on pourrais faire une pause tous les 100 mails envoyés.

Code:
// on cree et affiche le site
$Tpl->createTemplate();
$nbr_mail_pause = 100; // on fais une pase après 100 mails
$i = 0; // $i sera le compteur

for ($i=1;$i<$nb;$i++)
{
    $o = mysql_fetch_object($result_mail);
    $recipient=$o->news_mail;

    if (isset($_POST['select'.$i.''] ))
    {
        $mail =& Mail::factory("smtp", $smtp_params);
        $result = $mail->send($recipient, $headers, $body);  //envoi du mail

        $i++;
        if($i == $nbr_mail_pause)
        {
            // si $i = 100, on reinitialise $i à 0 et on fais la pause
            $i = 0;
            set_time_limit(20);
        }
    }
}

Sky
 
WRInaute discret
Oui, mais c'est plus dure à comprendre.
Ca fonctionne comme ceci et c'est plus facile à lire :)

Si cette personne ne comprend pas comment insérer une pause tous les 100 itérations, je pense qu'on doit mettre un code le plus explicite possible pour que cette personne puisse comprendre la logique avant de commencer à optimiser ou raccourcir le code qui est en général une étape secondaire.

Sinon, explication sur le comment du pourquoi du modulo en PHP : http://php.net/manual/fr/language.operators.arithmetic.php

Sky
 
Discussions similaires
Haut