17. januar 2006 - 12:07Der er
11 kommentarer og 1 løsning
Afsending af mange mails
Efter at have gransket Eksperten vedr. dette problem, er jeg ikke kommet frem til en endelig løsning. Derfor beder jeg nu om en som vil paste en "færdig" løsning!
Jeg vil gerne sende 1000 (eller flere) emails uden at min execution time udløber. (PHP kører i Safe-mode, og derfor kan jeg ikke ændre set_time_limit(0);)
Jeg har alle mails i et Array.
Det ser ud til at man kan sende 100 af gangen på en fiks måde, men.. jeg giver 60 point til den som giver mig løsningen!
Hvis du har gemt dine mailadresser i et array, den mail du vil sende, samt en counter i _SESSION!
Så er løsningen at loope X antal mailadresser igennem, og reload så siden
header("Location: dinmailsender.php");
som så skal fortsætte med de næste X mails!
Jeg har også indopereret en sleeper som ved hver anden reload sleeper XX sekunder og så reloader siden igen! Så man giver sin SMTP-server en chance for at kunne følge med!
Umiddelbart er der ikke så mange andre løsninger end den phliplip kommer med, når du ikke kan ændre i din max execution time.
Jeg foreslår nogenlunde samme løsning som phliplip, dog ikke baseret på en counter, der refresher efter X gennemløb. Hvad så hvis en e-mail tager 3 sekunder om at blive sendt? (hvis SMTP-serverne skulle være langsom).
Jeg ville nok arbejde med noget tid i stedet vha. time() og tjekke om tiden er ved at løbe ud. På den måde kan man sikre sig bedre mod at få en max execution timeout.
Jeg har lavet et nyhedsbrev-script (til intranet) til et firma i Holte og de bruger det i deres 20 butikker som ca. sender over 5000 mails ud.. Og der sender den 20 mails pr. loop og sleeper 2 sek tror jeg! De har ikke haft nogen probs endnu såvidt jeg er informeret!
phliplip: Jeg siger heller ikke dit script er fejlfyldt eller andet. Jeg siger bare, at jeg vil tage tidsfaktoren med i stedet. På den måde kan du undgå hvis SMTP-serveren svarer for langsomt (hvis din tidsgrænse er sat ok selvf.) og du kan udnytte tiden bedre (dvs. du kan undgå for mange reloads).
Du sender 20 mails pr. loop og sleeper i 2 sek. Det kunne jo være, at hvis tidsfaktoreren var med, så kunne du sende 40 mails pr. loop og sleep i 2 sek. Det giver en lille forbedring rent "tidsmæssigt" - det var blot det, som var min lille pointe - for der er intet galt med din løsning heller. :-)
cpfrande: Med "time()" kan man ikke bruge til at beregne hvor meget CPU-tid som en process har taget! Det kan man "microtime()". Men ideen er god, og jeg agter at bruge den måde at sende på!
Nu ved jeg ikke hvor meget du kender til de to, men hovedforskellen er at time() angives i sekunder, mens microtime() angives i microsekunder.
Du kan fint udregne hvor lang tid dit nuværende scripts har arbejdet med time(). Du får selvf. resultatet i sekunder, men det er vel også fint nok, eftersom max-execution-time er angivet i sekunder i PHPs opsætning.
Så det afhænger helt af hvordan du vil have resultatet :-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.