dedlfix: Newsletter Versand - 1 Sek META Refresh - HTTP Zusatandsl. Prot.

Beitrag lesen

Ich gehe mal davon aus, dass du PHP laufen hast. Ansonsten ist es prinzipiell gleich:

Ein Newsletter der via WEB Oberfläche im Browser versendet wird hat sehr viele Abbonenten.

Der Server hat einen Timeout von 10 Sekunden.

Diese eingestellten 10 Sekunden beziehen sich meist auf verbrauchte Prozessorzeit. Wenn ein Script warten muss, weil grad ein anderer Prozess an der Reihe ist oder weil es schläft, verbraucht es auch keine Zeit (Probier das mal aus!). Wenn das bei deinem Provider nicht so ist, dann ist das zum einen ungerecht und zum andern kann dir dann jeder beliebige andere Prozess dazwischenfunken. Du solltest dir dann überlegen, den Provider zu wechseln...

Werden alle User in einer Schleife durchlaufen, bekommen nichtmal ein Viertel eine Mail,
weil der der Server nach 10 Sekunden ein Timeout gibt.
Es sollte ja gehen, das Script aufzurufen mit einem Parameter:   newsletter.php?user=1-20
und beim nächsten Aufruf   newsletter.php?user=21=40
und dann  ?user=41-60  etc, etc, etc ....

Angenommen, die 10 Sekunden gelten wie oben beschrieben nur für eine einzige Instanz deines aufgerufenen Scripts, kannst du auch mehrere quasi gleichzeitig anstoßen und in jeweils einer eigenen Browserinstanz laufen lassen. Sie erhalten dann jeweils ihre 10 Sekunden.

Theoretisch ist ja HTTP ein Zustandloses Protokoll.
Wenn ich was sende,  und dann Abbreche, merkt das der Server nicht (oder?)

Zustandslos ist es von Applikationen aus betrachtet, die mehrere Webseiten umfassen. HTTP ist ein TCP und jeder Request + Response hat damit einen definierten Beginn, ein Ende und kann zwischendrin abgebrochen werden, sowohl durch Client als auch Server oder Timeout.

Getesteter Weise sitze ich 10 Sekunden vorm PC, bis die 20 Mails gesendet sind.
Das sah ich als ich die Schleife beim Senden einzeln die
Emails auf dem Bildschirm ausgeben ließ als sie gesendet wurden.

mit flush() nach jeder Mail und Stoppuhr oder mit Zeitmessung im Script (z.B. microtime()) getestet?

Nun wäre es aber ein Schwachsinn, ... [den] Server Timeout abzuwarten ...,  wenn der Server das eh nicht merkt.

Ob er das merkt kommt ganz drauf an ... siehe weiter unten.

Also könnte ich ja eigentlich ein Script schreiben,
das einen META Refresh von _1_Sekunde_(!!!) hat,
und sich dann gleich mit dem Parameter für die nächsten 20 Mails aufruft,
auch wenn in der 1 Sekunde  NICHT alle 20 Mails gesendet wurden,
weil auch nach dem Abbrechen(!) des Ladens nach der 1 Sekunde META Refresh
die anderen Mails noch weiter gesendet werden.

Der Refresh wird erst dann ausgeführt, wenn die Übertragung vollständig ist, sprich: wenn dein Script fertig abgearbeitet oder abgebrochen wurde. Im zweiten Fall aber nur, wenn der refresh-meta-Tag bereits im Browser gelandet ist. Das passiert ja nicht immer sofort, da der Webserver die Ausgabe zwischenspeichert, um nicht so viele kleine Pakete zu senden.

Alternativ zum meta-refresh und browserunabhängig kann man auch einen Location-Header schicken.

Die Frage ist nur, ob der Server wirklich brav die 20 Mails sendet,
auch wenn ich nach 1 Sekunde das Laden abbreche.

Da gibt es Einstellmöglichkeiten, wie PHP auf Abbruch durch den User reagieren soll. Ob das zuverlässig funktioniert weiß ich nicht.

Wenn das nicht so ist,  müsste ich wirklich immer die 10 Sekunden warten
bis die 20 Mails durch sind (die Zeit hab ich gestoppt)
und dann das Script erst neu aufrufen mit den nächsten 20....

Mehrere Fenster öffnen oder den meta-Refresh bzw. Location-Header das nacheinander tun lassen.

Ich würde das zusammen mit Toms Vorschlag, die versendeten Mails in der Datenbank zu markieren, und einem Meta-Refresh/Location-Header zu lösen versuchen.

Prinzip-Skizze:

if SELECT COUNT(*) from ... WHERE unversendet {
  Location-Header (PHP_SELF)
  flush();
  while (  SELECT ID,... FROM ... WHERE unversendet LIMIT 1 ) {
    Mail senden
    UPDATE versendet WHERE ID=id
  }
}

echo fertig