mailing tempo.....erreur!

Eléphanteau du PHP | 34 Messages

24 mars 2006, 15:41

Bonjour,

Le but est que je puisse afficher(avant d'envoyer) la liste ds mails, par paquet de 100 avec une pause de 3 sec entre chaque paquet. Merci d'avance!

Voila l'erreur:
Maximum execution time of 30 seconds exceeded

Voila le code!

$sql = "SELECT * FROM `toto`";
$result = mysql_query($sql) or die("Erreur dans la requete");
$attente = 3; // nombre de secondes

for ($i = 1; $i < 50; $i++){
while($ligne=mysql_fetch_row($result)){
echo $ligne[0];
}
if ($i % 10 === 0) { //
echo 'Attente de '.$attente.' seconde(s)<br/>';
sleep($attente); // pause de x seocndes
}
$i=1;
}

Eléphant du PHP | 67 Messages

24 mars 2006, 15:50

Bonjour,

Le but est que je puisse afficher(avant d'envoyer) la liste ds mails, par paquet de 100 avec une pause de 3 sec entre chaque paquet. Merci d'avance!

Voila l'erreur:
Maximum execution time of 30 seconds exceeded

Voila le code!

$sql = "SELECT * FROM `toto`";
$result = mysql_query($sql) or die("Erreur dans la requete");
$attente = 3; // nombre de secondes

for ($i = 1; $i < 50; $i++){
while($ligne=mysql_fetch_row($result)){
echo $ligne[0];
}
if ($i % 10 === 0) { //
echo 'Attente de '.$attente.' seconde(s)<br/>';
sleep($attente); // pause de x seocndes
}
$i=1;
}
il suffit d'augmenter le temps d'execution de ce script uniquement

en mettant au depart de ton script

http://fr.php.net/manual/fr/function.set-time-limit.php

set_time_limit([valeur en int]);

0 = illimité assez dangereux si tu as une boucle dans ton script...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 mars 2006, 15:51

Voila l'erreur:
Maximum execution time of 30 seconds exceeded
Le problème vient du fait que ton script met plus de 30 secondes à s'exécuter et le serveur génère du coup un timeout (la durée d'exécution d'un script avant timeout étant paramétrable dans le php.ini ou le httpd.conf, je sais jamais lequel des deux)

En fait ta boucle for est une boucle infinie, dans la mesure où à la fin tu remet toujours la variable $i à 1, elle ne s'incrémente donc jamais correctement et n'arrivera jamais à 50 ;)
for ($i = 1; $i < 50; $i++){ 
  while($ligne=mysql_fetch_row($result)){ 
    echo $ligne[0]; 
  } 
  if ($i % 10 === 0) { // 
    echo 'Attente de '.$attente.' seconde(s)<br/>'; 
    sleep($attente); // pause de x seocndes 
  } 
  // Ligne à supprimer : si $i est passé à 2 avec le for, ca le remet à 1 :)
  // $i=1; 
}

Eléphant du PHP | 67 Messages

24 mars 2006, 15:53

oups j'ai regarder l'erreur mais pas le code...

grosse bourde lol...

;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 mars 2006, 16:01

héhé :)

bah si ca peut te rassurer, j'étais parti dans ce sens là également, et puis j'ai voulu vérifier s'il ne faisait pas 50 pauses de 3 secondes en fait et chuis tombé sur ce $i qui trainait ;)

Eléphanteau du PHP | 34 Messages

24 mars 2006, 16:03

Mais j'ai pas l'impression qu'il fait ce que je lui demande....

En fait il faut que j'écrive 100fois $ligne[0] puis une pause de 3s puis re $ligne[0] et repause...jusqu'a qu'il n'y ai plus d'enregistrement dans la table.
Merci de votre aide!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 mars 2006, 16:12

Dans ce cas là tu peux juste te contenter du while à priori... à tester :)
$i = 1; // compteur
while($ligne=mysql_fetch_row($result)){ 
  echo $ligne[0]; 
  if ($i % 100 === 0) { // tous les 100 messages
    echo 'Attente de '.$attente.' seconde(s)<br/>'; 
    sleep($attente); // pause de x seocndes 
  }
  $i++; // incrémentation du compteur 
} 
Je démarre le compteur à 1 pour éviter les 3 secondes de pauses au premier passage si l'on démarrait à 0 :)

Mammouth du PHP | 768 Messages

24 mars 2006, 17:36

essaye comme ça... abandonne la boucle for.
mon exemple te donne un peu le principe, je ne l'ai pas testé, sans garantie... mais le principe de fonctionnement devrait être celui que tu souhaites
<?php
$expediteur = '[email protected]'; // Adresse de l'expéditeur
$sql = "SELECT mail FROM matable";  // jamais de SELECT *
$result = mysql_query($sql) or die(mysql_error()); // exécution de la req
$pause = 3; // nbr de seconde pour la pause 
$nbr= mysql_num_rows($result); // nombre de ligne resultant de la req

$i = 0; // initialise la variable pour le compteur de mail
$tmp = ''; // initialise la variable pour stocker les emails

if ($nbr !== 0){ // Si il y a au moins 1 résultat suite à la req
   while($row=mysql_fetch_assoc($result)){ // Lis les lignes 1 à 1
      $tmp.= $row['mail']; // Stocke l'adresse e-mail dans un tampon
      $i++; // ajoute 1 à la variable $i
      if ( ($i != $nbr) AND ($i % 100 !== 0) ) $tmp.= ',';  // si ns ne sommes pas à la fin de la liste d'email, ajoute une ,
      if ( $i % 100 === 0 ){ // si on est à la 100ème, on envoi le mail
         mail('[email protected]', 'sujet', 'texte',"From: ".$expediteur."\n\rBCC:".$tmp."\n\r");
         $tmp = ''; // on vide le tampon contenant les emails
         sleep($pause); // on attends X secondes
      }
   }
}
?>
Si vous voyez des erreurs, je suis toutoui :wink:
M A R I O
Si une patte de lapin porte bonheur, qu'a-t-il bien pu arriver au lapin ?