[php] hoelang kan een while lus door gaan?

Pagina: 1
Acties:
  • 67 views sinds 30-01-2008

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 09-01 18:51
PHP:
1
<?$sql = "SELECT user_email FROM users"; $result = mysql_query($sql); while ($list = mysql_fetch_object($result)) {     mail("$list->user_email", "$onderwerp" , "$bericht" , "From: www.blabla.nl <$username>\nReturn-path:$username"); } $server_anouncment = "Alle mailjes zijn verstuurd";?>

Dit stukje doet het prima. Nou vroeg ik me alleen af. Als daar nou een aardig grote db achter zit. Heb ik dan niet het probleem dat hij halverwege het versturen v/d mailtjes een timeout geeft en er dus mee stopt?

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
ja dat kan, tenzij je zelf de timeout kan instellen met SetTimeout(). Of als je geen gebruik maakt van ignore_user_abort en de user de stop knop induwt.

In zo'n geval kan je beter per keer een aantal e-mailtjes versturen, waarbij je in de database bijhoud bij welk e-mailtje je gebleven bent.

Trouwens, je database moet wel heel erg groot worden wil dat gebeuren en dan denk ik eerder dat je mailserver ermee kapt omdat z'n mailqueue vol zit.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 22-03 20:57

Skinny

DIRECT!

Na het succesvol versturen van een mailtje moet je even een vlaggetje zetten in je DB. Als ie dan vastloopt, kan je hem gewoon opnieuw starten en alleen de records selecteren zonder vlaggetje

SIZE does matter.
"You're go at throttle up!"


  • Postman
  • Registratie: Februari 2000
  • Laatst online: 01-05 13:23
Timeout moet je instellen in je PHP ini.
Verder zal idd je mailserver eerder kappen dan je PHP bestand.

Verwijderd

Je wil toch niet gaan spammen hé? :)

Hoop van niet! :| (

Verwijderd

je kan de timeout ook op 0 seconde zetten, dat wil zeggen dat ie niet aan staat :)
code:
1
set_time_limit(0);

  • Anders
  • Registratie: December 2000
  • Laatst online: 24-05 10:33
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>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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.


Verwijderd

Je kan natuurlijk ook de pagina verversen nadat er een aantal mailtjes verstuurd zijn. Door middel van de LIMIT in je SQL statement kan je dan een aantal mailtjes versturen en dan de pagina herladen en opnieuw een x aantal mailtjes versturen. Dit voorkomt ook server timeouts.

Moet je wel meegegeven waar de db gebleven is. Dus het aantal mailtjes dat al verstuurd is.

Het gevaar is alleen als de verbinding van de gebruiker traag is of verbroken word, is een deel niet verzonden, daarom zou je ook bij moeten houden in de db welke mailtjes verstuurd zijn.

Kost ook wat dataverkeer....

Verwijderd

Ik heb hetzelfde probleem (al bij 400 mails) waarbij na een aantal seconden een standaard Pagina kan niet worden gevonden melding wordt weergegeven.

Ik heb eens ergens gelezen dat met sprintf() of printf() dit kan worden opgelost door na iedere x-mails iets te printen naar de uitvoer. Is dit een goede oplossing of moet het toch met vinkjes achter de records?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:50

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 26 april 2004 @ 00:12:
Ik heb hetzelfde probleem (al bij 400 mails) waarbij na een aantal seconden een standaard Pagina kan niet worden gevonden melding wordt weergegeven.

Ik heb eens ergens gelezen dat met sprintf() of printf() dit kan worden opgelost door na iedere x-mails iets te printen naar de uitvoer. Is dit een goede oplossing of moet het toch met vinkjes achter de records?
Is het niet een idee om een cronjobje dit te laten uitvoeren? Een PHP pagina zet dan hooguit alle mails klaar, maar verstuurt ze niet.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • decramy
  • Registratie: December 2001
  • Laatst online: 22-05 07:45

decramy

root@birdie:~#

en 1 mailtje versturen met 400 BCCtjes??

20*375Wp met Enphase IQ7+ micro's | Stiebel Eltron HGE Water/Water WP 9kW | Tesla M3, powered by SmartEVSE | Servertje @ www.coloclue.net


  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 21:31

pietje63

RTFM

decramy schreef op 26 april 2004 @ 00:29:
en 1 mailtje versturen met 400 BCCtjes??
Komen dan snel in junkmail.
Ik verstuur regelmatig 450 mails en dat duurt dan iets van 5 seconde dus 400 moet zeker geen probleem zijn..

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 19:24
pietje63 schreef op 26 april 2004 @ 11:37:
[...]

Komen dan snel in junkmail.
Ik verstuur regelmatig 450 mails en dat duurt dan iets van 5 seconde dus 400 moet zeker geen probleem zijn..
Dat is etg snel! Heb je een lokale mailserver o.i.d.? Of gebruik je sendmail op linux?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:50

gorgi_19

Kruimeltjes zijn weer op :9

pietje63 schreef op 26 april 2004 @ 11:37:
[...]

Komen dan snel in junkmail.
Hoe kan een bcc mailtje snel in de junkmail komen? 't is een vrij normale manier van verzenden.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ten eerste doe je er beter aan om gewoon een nieuw topic te openen ipv de 2 jaar oude te kicken, dat voorkomt verwarring (vermeld wel even de topics die je had gevonden met de search). Maar verder is dit een vrij basic probleem wat je met de hier vermelde antwoorden op kunt lossen, dus deze gaat op slot (en je hoeft geen nieuw topic te openen)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1

Dit topic is gesloten.