[PHP] Zeitüberschreitung umgehen

djws

www.zocke.es
ID: 31169
L
20 April 2006
4.479
289
Hallo liebe Kollegen,

wer kann mir nen Tipp geben, wie ich die Zeitüberschreitung umgehen kann.

Sprich: ich habe ein Newsletter-Script und möchte aber jeden User persönlich anschreiben. Die Daten dazu (also User Name, nick und Emailadresse) habe ich in meiner mysql_DB gespeichert.

Wenn ich jedoch eine normale while-Schleife mache und in dieser while-Schleife die funktion "mail" ausführe, dann kann es schonmal vorkommen, dass es zwischen 2 und 5 min dauert bis alle ihren Newsletter erhalten haben.
Das belastet den Server natürlich relativ stark und kann natürlich auch zu einer Zeitüberschreitung führen.

Nun meine Frage nochmal: Wie kann ich eine solche Zeitüberschreitung umgehen bzw das Script dahingehend verbessern, dass die NL schnell versendet werden, jedoch jeder User persönlich angesprochen wird ?
 
set_time_limit(), so dein Provider das erlaubt ;)

Ansonsten darfst du halt nur x Mails in einem Scriptaufruf verschicken und musst das Script mehrfach laufen lassen.
 
Wie viele Mails verschickst du denn? Das wäre gut zu wissen, so kann man dir zumindest mal sagen, ob du zu ressourcenfressend gecoded hast..
 
ich nutze folgende Methode:
Alle User laden und NL mit deren Infos zusammenstellen, dann in der Datenbank speichern und nen Cron haut alle 5min 300 Stück raus
 
ich nutze folgende Methode:
Alle User laden und NL mit deren Infos zusammenstellen, dann in der Datenbank speichern [...]
Lässt du den Newsletter-Text dann von PHP in ner Schleife zusammenstellen oder lässt du MySQL das mit einem einzigen Query erledigen ?
 
Lässt du den Newsletter-Text dann von PHP in ner Schleife zusammenstellen oder lässt du MySQL das mit einem einzigen Query erledigen ?

wird in PHP gemacht, weil sonst müsste das nen Join über 5-6 Tabellen bilden, da dies auch kein zeitkritischer Aufruf ist und selten aufgerufen wird muss es nicht optimal optimiert werden. Das mache ich dann lieber im Userbereich oder an anderen Stellen die oft ausgeführt oder wenn sich meinem SQLite-Log mal wieder ein ERROR_MYSQL_SLOW_LOG-Fehler findet findet :LOL:
 
also erstmal vielen Dank für eure Tipps.

es sind aktuell ca 300 Mails die auf einmal verschickt werden.

Allerdings wäre eine ähnliche Variante für den automatischen Versand der Paidmails sehr interessant von daher sind die Vorschläge auf jeden Fall auch dafür interessant. Bei Paidmails kommen schnell mal wesentlich merh wie 300 zusammen (also ein vielfaches davon)

Ice-Breakers Lösung finde ich sehr gut und die kann ich sicher auch selber umsetzen ;)

Danke erstmal.

Aber wenn jemand noch andere evtl auch bessere Vorschläge hat immer mal her damit, diese infos sind sicher auch für andere interessant.
 
Wie meinste das mit dem Script mehrfach aufrufen?
Einfach per header(); nach z.B. 50Mails die Seite neuladen mit dem Anhang ?mailstart=51 oder so?
Exakt.

Allerdings hat diese Variante gegenüber ice-breaker's Variante folgende Nachteile:
  • Der Server wird durchgehend belastet, solange, bis alle Mails draußen sind
  • Reicht die Zeit aus irgendeinem Grund nicht aus, bricht das Script einfach ab. Die restlichen Mails gehen nicht raus. Schlimmer: Es ist nicht bekannt, welche Mails geschickt wurden und welche nicht.
 
  • Reicht die Zeit aus irgendeinem Grund nicht aus, bricht das Script einfach ab. Die restlichen Mails gehen nicht raus. Schlimmer: Es ist nicht bekannt, welche Mails geschickt wurden und welche nicht.

Vielleicht nicht besonders effizient, aber meine Lösung:
- Die Newsletterempfänger werden in einem Query ermittelt und geeignet sortiert, so dass die Reihenfolge klar ist.
- Es wird in die Datenbank eingetragen an wieviele Empfänger die Mail gehen wird.
- Nach jeder versandten Mail wird in die Datenbank eingetragen wie oft die Mail bereits versandt wurde.
- Egal zu welchem Zeitpunkt der Versand abbricht und egal weshalb (timeout / mailqueue voll), man kann zu jedem Zeitpunkt durch Vergleich der beiden Zahlen prüfen, ob die Mail schon vollständig versandt ist.
- Wenn nicht kann man den Mailversand ohne weiteres genau da fortsetzen wo er abbrach, da man ja weiß, an wieviele sie schon raus ging.
 
Deine Methode würde aber bedeuten das man so viele Querys an die DB Schickt wie man mail versenden will.

Angenommen 300 Mails gehen raus, das wäre mit deiner Lösung 302 Querys und das ist nicht effizient zumal die jeweilige Query senden auch Zeit in anspruch nimmt.
 
Allerdings hat diese Variante gegenüber ice-breaker's Variante folgende Nachteile

jaa, meines ist die beste muhaha :mrgreen:

neija, gibt viel leicht noch bessere, aber die ist eben simpel, und der Vorteil ist vorallem, dass der Server nicht langsam wird, wenn mal 10-20k Mails in der Qeue von postfix hängen, da ja alle Mails über einen Zeitraum gesendet werden und nicht schlagartig.
 
Dann muss man ja dauernd neue Cronjobs erstellen für alle 300User...
Oder verstehe ich da was falsch?

Ich verstehe das so, dass das script alle 5 minuten aufgerufen wird. bei jedem aufruf wird überprüft ob mails verschickt werden sollen. ist dies der fall so werden die nächsten 300 empfänger mit einer abfrage abgefragt und werden als verschickt markiert.
nach der markierung werden die mails rausgeschickt und der nächste durchlauf wird abgewartet.
 
genauso sehe ich das auch thestyler !

es ist immer ein und dieselbe Datei, die dann immer wieder aufgerufen wird.

Bei einem newsletter-script ist es meiner Meinung nach aber nicht mit einem cron getan, sondern es muss irgendeine andere Lösung geben, da ein Newsletter ja nicht in so regelmäßigen Abständen verschickt wird wie z.B. Paidmails.

von daher wäre eine sleep-Funktion sicher garnicht schlecht, aber ich glaube das würde den Server doch wieder belasten oder ??
 
Bei einem newsletter-script ist es meiner Meinung nach aber nicht mit einem cron getan, sondern es muss irgendeine andere Lösung geben, da ein Newsletter ja nicht in so regelmäßigen Abständen verschickt wird wie z.B. Paidmails.

Öhm es ist doch realtiv wayne ob du einen Newsletter oder eine Paidmail sendest :LOL:
Egal was per Mail raus soll, wird in die Datenbank eingetragen und der Server prüft IMMER alle 5min ob mails zum rausenden da sind, wenn nicht macht er eben nix, das hat nix mit paidmails oder newslettern zu tun. Und wer das ganze noch verfeinern will, baut prioritäten mit ein, damit bestimmte mails vor anderen verschickt werden.

Eine sleep-Funktion ist totaler Quatsch, da die Zeit meines Wissens zu der Ausführungszeit dazugerechnet wird (ist ja auch logisch) und ihr dadurch genau das Gegenteil von dem erreicht, was ihr wollt.