Annonce

#1 Re : Aide technique » Problème de taille de requete avec mass mail » 2006-11-21 16:17:38

j'utilse "contrib/wanewsletter" bien entendu ^^ et l'option limit, les 460 000 autres mails je fait comment pour les envoyer ?

ps : ben pour etre franc mes process mysql ne depase pas 40% en resources sur l'envoi de 500 000 donc bof ça dérange pas plus que ça.

#3 Re : Aide technique » Problème de taille de requete avec mass mail » 2006-11-19 16:06:31

Voila les modifications que j'ai apporté afin de garder les possibilités du script et de dépaser le cap de 40 000mails par envoir.

Voila je passe tout l'état des envois en base (question de gout) et procede de façon recurcive pour les mises à jours des états, c'est plus long en therme d'execution mais sans limites au moins.

( ATTENTION je ne suis pas un grand dev, loin de la, j'ai testé chez moi ça marche sans bug, mais c'est pas 100% sur, d'ailleur je suis ouvert à tout commantaire smile )

(Record à 512 867)

Éditez le fichier admin/envoi.php (ligne 236~)

foreach( $liste_ids as $liste_id )
            {
                $lockfile = sprintf(WA_LOCKFILE, $liste_id);
               
                if( file_exists($lockfile) && filesize($lockfile) > 0 )
                {
                    $fp = fopen($lockfile, 'r+');
                   
                    if( flock($fp, LOCK_EX|LOCK_NB) )
                    {
                        $abo_ids = fread($fp, filesize($lockfile));
                        $abo_ids = array_map('trim', explode("\n", trim($abo_ids)));
                       
                        if( count($abo_ids) > 0 )
                        {
                            $abo_ids = array_unique(array_map('intval', $abo_ids));
                           
                            $sql = "UPDATE " . ABO_LISTE_TABLE . "
                                SET send = 1
                                WHERE abo_id IN(" . implode(', ', $abo_ids) . ")
                                    AND liste_id = " . $liste_id;
                            if( !$db->query($sql) )
                            {
                                trigger_error('Impossible de mettre à jour la table des abonnés', ERROR);
                            }
                        }
                       
                        ftruncate($fp, 0);
                        flock($fp, LOCK_UN);
                    }
                   
                    fclose($fp);
                }
            }

En

foreach( $liste_ids as $liste_id )
                {
                    $table_lockfile = "locktable".$liste_id;
                    
                    $sql = "SELECT count(*) FROM ".$table_lockfile.";";
                    if($result = $db->query($sql))
                    {
                        $row = $result->fetch();
                        $count = $row["count(*)"];
                        if($count > 0)
                        {
                            $sql = "SELECT id_email
                            FROM ".$table_lockfile.";";
                            if( !($result = $db->query($sql)) )
                            {
                                trigger_error('Impossible d\'obtenir les données d\'envoi des log', ERROR);
                            }
                            while( $row = $result->fetch() )
                            {
                                $sql2 = "UPDATE " . ABO_LISTE_TABLE . "
                                    SET send = 1
                                    WHERE abo_id = '".$row['id_email']."'
                                    AND liste_id = '" . $liste_id."'";
                                if( !$db->query($sql2) )
                                {
                                    trigger_error('Impossible de mettre à jour la table des abonnés', ERROR);
                                }
                            }
                            
                            $sql = "TRUNCATE TABLE `".$table_lockfile."`;";
                            $result = $db->query($sql);
                        }
                    }
                }

Éditez le fichier include/engine_send.php (ligne 50~)

$lockfile = sprintf(WA_LOCKFILE, $listdata['liste_id']);
   
    if( file_exists($lockfile) )
    {
        $isBeginning = false;
        $fp = fopen($lockfile, 'r+');
        $supp_address = array();// On en tient pas compte, ça l'a déjà été lors du premier flôt
    }
    else
    {
        $isBeginning = true;
        $fp = fopen($lockfile, 'w');
        @chmod($lockfile, 0600);
    }
   
    if( !flock($fp, LOCK_EX|LOCK_NB) )
    {
        fclose($fp);
        return $lang['Message']['List_is_busy'];
    }
   
    if( filesize($lockfile) > 0 )
    {
        //
        // L'envoi a planté au cours d'un "flôt" précédent. On récupère les éventuels
        // identifiants d'abonnés stockés dans le fichier lock et on met à jour la table
        //
        $abo_ids = fread($fp, filesize($lockfile));
        $abo_ids = array_map('trim', explode("\n", trim($abo_ids)));
       
        if( count($abo_ids) > 0 )
        {
            $abo_ids = array_unique(array_map('intval', $abo_ids));
           
            $sql = "UPDATE " . ABO_LISTE_TABLE . "
                SET send = 1
                WHERE abo_id IN(" . implode(', ', $abo_ids) . ")
                    AND liste_id = " . $listdata['liste_id'];
            if( !$db->query($sql) )
            {
                trigger_error('Impossible de mettre à jour la table des abonnés', ERROR);
            }
        }
       
        ftruncate($fp, 0);
        fseek($fp, 0);
    }

EN

$table_lockfile = "locktable".$listdata['liste_id'];
    
    $sql = "SELECT count(*) FROM ".$table_lockfile.";";
    if($result = $db->query($sql))
    {
        $isBeginning = false;
        $supp_address = array();// On en tient pas compte, ça l'a déjà été lors du premier flôt
    }else
    {
        $isBeginning = true;
        $sql = "CREATE TABLE `".$table_lockfile."` (
            `id` INT( 11 ) NOT NULL AUTO_INCREMENT  ,
            `id_email` VARCHAR( 100 ) NOT NULL ,
             PRIMARY KEY ( `id` )
            );";
        $result = $db->query($sql);
        $count = 0;
    }
    
    if($count > 0)
    {
        //
        // L'envoi a planté au cours d'un "flôt" précédent. On récupère les éventuels
        // identifiants d'abonnés stockés dans le fichier lock et on met à jour la table
        //
        $sql = "SELECT id_email
            FROM ".$table_lockfile.";";
        if( !($result = $db->query($sql)) )
        {
            trigger_error('Impossible d\'obtenir les données d\'envoi des log', ERROR);
        }
        while( $row = $result->fetch() )
        {
            $sql2 = "UPDATE " . ABO_LISTE_TABLE . "
                SET send = 1
                WHERE abo_id = '".$row['id_email']."'
                AND liste_id = '" .$listdata['liste_id']."'";
            if( !$db->query($sql2) )
            {
                trigger_error('Impossible de mettre à jour la table des abonnés', ERROR);
            }
        }
            
        $sql = "TRUNCATE TABLE `".$table_lockfile."`;";
        $result = $db->query($sql);
    }

Éditez le fichier include/engine_send.php (ligne 356~)

fwrite($fp, implode("\n", $abo_ids[FORMAT_TEXTE])."\n");

EN

$sql2 = "INSERT INTO `".$table_lockfile."` VALUES('','".$abo_ids[FORMAT_TEXTE]."');";
$result2 = $db->query($sql2);

Éditez le fichier include/engine_send.php (ligne 378~)

fwrite($fp, implode("\n", $abo_ids[FORMAT_HTML])."\n");

EN

$sql2 = "INSERT INTO `".$table_lockfile."` VALUES('','".$abo_ids[FORMAT_TEXTE]."');";
$result2 = $db->query($sql2);

Éditez le fichier include/engine_send.php (ligne 555~)

fwrite($fp, "$row[abo_id]\n");

EN

$sql2 = "INSERT INTO `".$table_lockfile."` VALUES('','".$row['abo_id']."');";
$result2 = $db->query($sql2);

Éditez le fichier include/engine_send.php (ligne 631~)

if( count($abo_ids) > 0 )
    {
        $sql = "UPDATE " . ABO_LISTE_TABLE . "
            SET send = 1
            WHERE abo_id IN(" . implode(', ', $abo_ids) . ")
                AND liste_id = " . $listdata['liste_id'];
        if( !$db->query($sql) )
        {
            trigger_error('Impossible de mettre à jour la table des abonnés (connexion au serveur sql perdue)', ERROR);
        }
    }

EN

if( count($abo_ids) > 0 )
    {
        $sql = "SELECT id_email
            FROM ".$table_lockfile.";";
        if( !($result = $db->query($sql)) )
        {
            trigger_error('Impossible d\'obtenir les données d\'envoi des log', ERROR);
        }
        while( $row = $result->fetch() )
        {
            $sql2 = "UPDATE " . ABO_LISTE_TABLE . "
                SET send = 1
                WHERE abo_id = '".$row['id_email']."'
                AND liste_id = '" .$listdata['liste_id']."'";
            if( !$db->query($sql2) )
            {
                trigger_error('Impossible de mettre à jour la table des abonnés', ERROR);
            }
        }
    }

Éditez le fichier include/engine_send.php (ligne 579~)

flock($fp, LOCK_UN);
                fclose($fp);
                unlink($lockfile);

EN

$sql = "DROP TABLE `".$table_lockfile."`;";
$result = $db->query($sql);    

Éditez le fichier include/engine_send.php (ligne 668~)

ftruncate($fp, 0);
    flock($fp, LOCK_UN);
    fclose($fp);

EN

$sql = "TRUNCATE TABLE `".$table_lockfile."`;";
$result = $db->query($sql);

Éditez le fichier include/engine_send.php (ligne 684~)

unlink($lockfile);

EN

$sql = "DROP TABLE `".$table_lockfile."`;";
$result = $db->query($sql);    

#4 Re : Discussions » Envoi gros volume » 2006-11-19 13:18:39

ça devrais passer, le cap se situe plus vers les 40k. Néanmois je pense poster mes modif cettes aprem.

#5 Re : Discussions » Envoi gros volume » 2006-11-17 18:49:15

j'ai fait 500 000, mais j'ai du adapter le script, certaine méthode ne sont pas fonctionnels pour de tel chiffre.

#6 Re : Aide technique » Envoi en mail chaché » 2006-11-17 12:01:31

Voila je voulais en savoir plus sur cette technique. A savoir combien de mails sont envoyé en caché ? il y a une limit de destiantaire caché ?

Merci bp smile

#7 Re : Aide technique » Problème de taille de requete avec mass mail » 2006-11-16 12:05:30

Voila je fait de l'envoi de mass (+500 000) ça marche mais .. j'ai fait des gros trou dans ton code smile et j'aimerais corriger ces trous.

Voila principalement ou j'ai un problème :

abo_id IN(" . implode(', ', $abo_ids) . ")

Comme tu dois t'en douter avec 500 000mails envoyer j'atomise la requete sql, la liste étant bien trop grande sad

Je connais encore mal tout ton code, comme solution je ne vois que l'insertion dans une table temporaire des liste abo_id.

Voila si tu as un conseil je suis preneur smile

ps : il y a un raison particulière pour avoir passé par fichier et non pas une table ?
ps2 : tu travails avec les fichiers lockfile dans engine_send.php, et envoi.php, il y a d'autres ?

#8 Re : Aide technique » Mass mail, rcon » 2006-10-31 17:00:08

:biere:

Il n'y a actuellement aucun envoi à reprendre

Merci !!! Ca marche ^^merci de ta patience ! j'ai hate de tester ça smile

A bientôt smile

Edit : Si je peu me permetre de remetre mes suggestions big_smile

- Possibilité de vider par une simple commande les inscrits d'une liste
- Possibilité de dupliquer une liste, d'importer les inscrits d'une autre liste.
- Outils statistique interne (ça se serais enorme ^^)
- Pouvoir donner un alias a l'adresse mail d'envoi autre que le nom de la liste.

Encore une fois bravo ! et j'ai hate de voir l'évolution big_smile

#9 Re : Discussions » [WAnewsletter] Proportion d'emails lors de vos envois » 2006-10-29 17:13:33

Envoi de 195711 mails en 5h27 pour promotions auprés de clients.

#10 Re : Discussions » [SUGESTIONS] Pour le mass mailling. » 2006-10-29 17:09:46

- Possibilité de vider par une simple commande les inscrits d'une liste
- Possibilité de dupliquer une liste, d'importer les inscrits d'une autre liste.
- Outils statistique interne (ça se serais enorme ^^)
- Pouvoir donner un alias a l'adresse mail d'envoi autre que le nom de la liste.

Je savais pas trop ou indiquer ceci dsl si j'ai mis au mauvais endroit.

Merci pour ce superbe boulot.

#11 Re : Aide technique » Mass mail, rcon » 2006-10-29 16:58:23

Bonjour,

Tout d'abors encore une fois merci de ton aide et pour ton script, à titre d'information celui ci m'a permis d'envoyer il y a qqjour 195711 mails big_smile Il a quelques points à revoir pour du mass mailling mais la fonction est bien la ^^ J'ai tout fait en envoi par la page web ^^ mais ça marche smile

Bien sur j'aimerais passé en cron pour rendre l'envoi plus efficase, et pratique.

Ligne 1 : #!/usr/local/bin/php /"monchemin"/wanewsletter_sql -q

=>

./wanewsletter --process-send=2
.ould not open input file: /"monchemin"/wanewsletter_sql -q

bref je patoge ... si tu pouvais me dire a quoi sert cette lignen et son argument pe j'arriverais à trouver ou est le pb.

Merci d'avance

#12 Re : Aide technique » Mass mail, rcon » 2006-10-28 15:01:41

Tout d'abors merci bp de ta réponse.

Pour l'envoi par cron.php, j'ai bien apply le fix mais j'arrive comme donni sur une impasse lors des flots suivant. (ici)

Pour l'envoi par ligne de commande

whereis php => php: /usr/local/bin/php /usr/local/lib/php /usr/local/lib/php.ini

avec
#!/usr/local/lib/php -q dans le fichier wawasletter =>
bash: ./wanewsletter: bad interpreter: Permission denied

avec
#!/usr/local/bin/php -q dans le fichier wawasletter =>
Usage: php [options] [-f] <file> [--] [args...]
       php [options] -r <code> [--] [args...]
ect


merci de l'aide à trés bientot j'éspere. smile

#13 Re : Aide technique » Mass mail, rcon » 2006-10-24 19:30:04

Bonsoir,

Version : 2.3.1
System : linux, server dédié
PHP : 4.3.9
SMTP : non
Moteur : 1 email pour abo

Je ferais ma question en 2 partir car aucune n'a abouti smile

- Envoi de liste par "options/cron.php?mode=send&liste=2"

=> "Il n'y a actuellement aucun envoi à reprendre"
Je sais pas trop comment mettre mon envoi dans ce statut sad j'ai essayé mais rien a faire. Pour info j'ai fais cette methode (rcon non, et pas de smtp), pe viens de la ?

- envoi avec "/path/to/contrib/wanewsletter --process-send=2" (en replacent pour le chemin bien sur).

=> "./wanewsletter  --process-send=2" ... "bash: ./wanewsletter: bad interpreter: No such file or directory", la je nage big_smile

Bref tout aide serais tres bien venu, merci a tous d'avance !

+

Pied de page des forums

Propulsé par FluxBB