[PHP] Mailing loopt vast op 70%

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo coders,

Wie kan mij helpen met de oplossing. We hebben ruim 4000 leden en als er nu een mailing de deur wordt uitgestuurd met onderstaand script, loopt de mailing telkens op 70% vast en geeft dus een timeout. Hoe kunnen we dat het beste oplossen?

Thanks.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
foreach ($html_members as $name=>$mail){
    if($smtp->SendMessage(
        $data->sender_mail,
        array(
            $mail
        ),
        array(
            "MIME-Version: 1.0",
            "Content-type: text/html; charset=iso-8859-1",
            "X-Priority: 3",
            "X-MSMail-Priority: Normal",
            "X-Mailer: Microsoft Office Outlook, Build 11.0.6353",
            "X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180",
            "Subject: City4u.nl Nieuwsbrief",
            "From: \"City4u.nl Team\" <no-reply@city4u.nl>",
            "To: \"".$name."\" <".$mail.">"
        ),
        $text)){
        if ($prev!=round((($i / $a) * 100),1)){
            echo "<script> document.getElementById('stats').innerHTML=\"Mailing ".round((($i / $a) * 100),1)."% voltooid, ".$i." mails.\"; </script>\n";
            $prev=round((($i / $a) * 100),1);
        }
        flush();
        $s++;
    }else{
        echo "<script> document.getElementById('stats').innerHTML=document.getElementById('stats').innerHTML + \"<br><br><b>Last error:</b> ".$smtp->error.".\"; </script>\n";
        $m++;
    }
$i++;
}
$end=time();
flush();

$duration=($end - $start) - 3600;
$duration=date("H\h i\m s\s",$duration);

echo "<script> document.getElementById('stats').innerHTML=\"Mailing verstuurd <br><br>&nbsp;&nbsp;- ".$m." mislukt<br>&nbsp;&nbsp;- ".$s." succesvol<br><br>&nbsp;&nbsp;- ".count($html_members)." Html mails<br>&nbsp;&nbsp;- ".count($text_members)." Text mails<br><br>Verstuurd in ".$duration."\"; </script>\n";

Acties:
  • 0 Henk 'm!

  • winand
  • Registratie: April 2000
  • Laatst online: 13-09 10:32
Je server instellingen aanpassen:
maximum script execution time verhogen.
Een andere manier is om een php-ketting te maken:
- php pagina verstuurt 100 mailtjes,
- redirect naar dezelfde pagina, met ?start=100 (deze verstuurt de volgende 100 mailtjes)
- redirect naar dezelfde pagina, met ?start=200 (deze verstuurt de volgende 100 mailtjes)
- etc etc

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Ombouwen naar een cli-script wat je vanuit een cron uitvoert? En dan ook nog eens opgesplitst in normale aantallen?

Of gewoon errorhandling doen zodat je weet waar het fout gaat.

Nu probeer je met 1 php script 4000 mails de deur uit te doen, of je loopt tegen een time-out van php aan of tegen een mailserver-error, of tegen een combinatie van beide.
En dan over een tijdje het stuk zien gaan omdat je hoster heeft besloten dat deze optie te veel misbruikt wordt? Of je browser zien stoppen met het percentage omdat je browser een timeout geeft? Of dit open laten staan in een tab, alle tabs refreshen en dan mensen krijgen die vragen waarom ze mailing x 2x of meer hebben gehad?

Nee, maak er dan maar gewoon een losse cli applicatie van, kan je in samenspraak met je hoster ook nog eens op een rustig tijdstip het uitvoeren..
winand schreef op maandag 28 april 2008 @ 22:37:
Je server instellingen aanpassen:
- php pagina verstuurt 100 mailtjes,
- redirect naar dezelfde pagina, met ?start=100 (deze verstuurt de volgende 100 mailtjes)
Waarom een redirect met start=100? Houd gewoon in een dbase de status van de mailtjes bij ( niet verstuurd / verstuurd / ontvangen / gelezen ) en vuur hier een query op af die alleen de eerste 100 niet verstuurde ophaalt en verstuurt, heb je een error / timeout kan je gewoon verdergaan waar je was.

[ Voor 62% gewijzigd door Gomez12 op 28-04-2008 23:00 ]


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

PHP:
1
 set_time_limit(0);

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
De mooiste oplossing is om er een cli script van te maken en eventueel gebruik te maken van meerdere mailservers voor het versturen van mail (om de load te verdelen). Tevens kan je de berichten vantevoren sorteren op MX record, zodat berichten naar eenzelfde mailserver (ontvangende mailserver dus) door de versturende mailserver efficienter afgehandeld kunnen worden (er hoeft maar 1 keer een verbinding nar die mailserver geopend te worden).

Dit script zou je via een cronjob aan kunnen roepen (of op een andere manier natuurlijk).

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heb de set_time_limit en de php.ini verlengt en het is eindelijk gelukt om ze allemaal te versturen. Alllemaal hartstikke bedankt voor jullie bijdrage. Groet, Chris

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op dinsdag 29 april 2008 @ 00:00:
Heb de set_time_limit en de php.ini verlengt en het is eindelijk gelukt om ze allemaal te versturen. Alllemaal hartstikke bedankt voor jullie bijdrage. Groet, Chris
Wtf, gewoon even een nieuwsgierig vraagje, maar als het eindelijk gelukt is om ze allemaal te versturen, hoevaak heeft de 1e persoon hem dan ondertussen gehad?

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Misschien is PEAR Mail Que iets voor je? Dit kun je met een cronjob aanroepen en verstuurt mailtjes in batches. Zorgt er ook voor dat je mailserver niet teveel belast wordt.
Pagina: 1