Mocht je de timeout niet kunnen veranderen, dan kun je ook met een timer werken. Ik heb van een oud project de volgende code liggen:
PHP:
1
| <?// Vervang "[datum]" door huidige datum:$This_MailBody = str_replace("[datum]", $nu, $This_MailBody);$Total_Mailinglist = $db->get_Mailinglist_cnt();$Total_Batch = $db->get_Mailinglist_Todo_cnt($Mail_ID);$This_Batch = 0;$starttime = time();$stop = time() + $timeout; // $timeout is 25 sec.while (time() < $stop ) {//for ($i=0; $i<2; $i++) { if ($sub = $db->get_NextAdressToMail($Mail_ID)) { $idML = $sub[0]["idML"]; $ML_Email = $sub[0]["ML_Email"]; $This_Mailed = @mail($ML_Email, "Nieuwsbrief ...", $This_MailBody, "From: john@doe.nl"); if ($This_Mailed) { $This_Batch++; // Stel bij dit emailadres in dat de mailing $Mail_ID is verstuurd $sub2 = $db->set_Mailingsent($idML, $Mail_ID); } /* // Bouw vertraging in voor testfase while (time() < $starttime + (3 * $This_Batch)) { // do nothing } */ } else {// echo("niks gemaild"); break; }}$Todo = $Total_Batch - $This_Batch;echo("<H2>Versturen van mailing</H2><TABLE>");echo("<TR><TD>Totaal aantal geactiveerde inschrijvingen op de mailinglist:</TD>");echo("<TD ROWSPAN=10>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN=top>$Total_Mailinglist</TD></TR>");echo("<TR><TD>Totaal aantal inschrijvingen die nog gemaild moesten worden:</TD>");echo("<TD VALIGN=top>$Total_Batch</TD></TR>");echo("<TR><TD>Totaal aantal mailings verstuurd bij deze opdracht:</TD>");echo("<TD VALIGN=top>$This_Batch</TD></TR>");echo("<TR><TD><B>Nog te mailen:</B></TD><TD VALIGN=top><B>$Todo</B></TD></TR>");echo("</TABLE>");if ($Todo) { echo("<P><B CLASS=urgent>[img]\"../gfx/redactie/icon_warning.gif\"[/img]");echo("LET OP!</B> <P>Nog niet alle mailings zijn verstuurd. ");echo("Klik <A HREF=\"mailinglist.php?Action=MailBatch\">hier</A> voor de volgende serie");} else { echo("<P>De mailing is met succes verstuurd naar de gehele mailinglist!");}?> |
Ik maak gebruik van een class $db om bepaalde waardes snel op te kunnen halen maar ik denk dat wel duidelijk is wat de betreffende functies doen.
Toegegeven, de kans is dat, als mail() er langer dan 25 seconden over doet, je met een timeout te maken krijgt. De volgende keer wanneer je de pagina oproept kun je dan echter gewoon verder.
Overigens: Denk er eens aan om de functie
flush() te gebruiken om de gebruiker op de hoogte te houden van de voortgang van een mailtje. Denk aan het volgende:
code:
1
2
3
| <FORM NAME=ProgressForm>
<INPUT NAME=Count SIZE=50>
</FORM> |
PHP:
1
| <?// $Total_Batch = totale aantal te verzenden mailings// $This_Batch = aantal reeds verzonden mailingsif ($This_Batch%20 == 0) { $value = $This_Batch . " van " . $Total_Batch . "mailings verstuurd"; echo("<SCRIPT>\n"); echo("document.ProgressForm.Count.value='$value';\n"); echo("</SCRIPT>\n\n"); flush();}?> |
etc.. You get the idea: elke 20 verstuurde mails hou je zo de gebruiker op de hoogte van de stand. Kost wat dataverkeer en maakt het geheel wat langzamer maar je voorkomt wel dat gebruikers halverwege op de stop-knop drukken omdat ze denken dat er niks gebeurt.
Ik spoor veilig of ik spoor niet.