jo: newsletter soll 2000 mail's zeitversetzt versenden

hallo,

Ich habe ein Newsletter programmiert,indem sich schon einige Leute (+-2000) eingetragen haben.

Ich will sie aber nicht alle auf einmal versenden, da ich den Server nicht überlasten will.

  • Bietet PHP mir irgendwelche möglichen e-mail's in abständen von 200 zu senden, dann eine pause machen soll, und dann die nächsten 200 senden.
  • Wie wird das sonst gewöhnlich gemacht ?
  • Oder müssen da andere Programme ran ?

gruß
jo

  1. Moin,

    ich glaube mir erinnern zu können, dass JavaScript eine Funktion bietet welche sich setTimeout(); schimpft.

    Google einfach mal nach "setTimeout() + JavaScript + Beispiel".
    Falls du etwas gefunden hast, dann würde ich wie folgt vorgehen :

    - Erster Aufruf der Seite
      - JavaScript setzt eine Pause bis zur nächsten Aktualisierung
      - Beim nächsten Aufruf wird der nächste Teil der E-Mails versendet

    Gruß
    zerko

    hallo,

    Ich habe ein Newsletter programmiert,indem sich schon einige Leute (+-2000) eingetragen haben.

    Ich will sie aber nicht alle auf einmal versenden, da ich den Server nicht überlasten will.

    • Bietet PHP mir irgendwelche möglichen e-mail's in abständen von 200 zu senden, dann eine pause machen soll, und dann die nächsten 200 senden.
    • Wie wird das sonst gewöhnlich gemacht ?
    • Oder müssen da andere Programme ran ?

    gruß
    jo

    1. Moin,

      ich glaube mir erinnern zu können, dass JavaScript eine Funktion bietet welche sich setTimeout(); schimpft.

      Ich will auf keinen Fall JavaScript verwenden da ich es nicht für zuverlässig halte.
      Es muß doch auch eine möglichkeit in PHP geben.

      Google einfach mal nach "setTimeout() + JavaScript + Beispiel".
      Falls du etwas gefunden hast, dann würde ich wie folgt vorgehen :

      die funktion setTimeout ist mit bekannt.

      gruß
      jo

      1. Moin!

        Ich will auf keinen Fall JavaScript verwenden da ich es nicht für zuverlässig halte.

        Wieso das denn nicht? Für den Aufruf des Versandskriptes bist doch du ganz allein verantwortlich? Hast du persönlich bei dir Javascript abgeschaltet?

        Wenn ja, dann gilt dein Einwand. Dann gäbe es immer noch die Möglichkeit eines Meta-Refresh (den man nach deiner Sichtweise dann aber auch als unzuverlässig bezeichnen müßte).

        Wenn nein: Stell dich nicht so an!

        Es muß doch auch eine möglichkeit in PHP geben.

        Eine PHP+Browser-Konstruktion hat das Problem, dass erstens PHP nur eine begrenzte Zeit lang läuft (eine absichtliche Maßnahme, um versehentliche Endlosschleifen nicht endlos auf dem Server rödeln zu lassen), und zweitens dass auch der Browser nicht endlos wartet, wenn keine Daten reinkommen.

        Die Aufteilung in kleinere Jobs ist daher bei diesen Vorraussetzungen wirklich nur dadurch möglich, dass das PHP-Skript jeweils nur einen kleinen Teil der Arbeit vornimmt, dabei auch abspeichert, welche Adressen schon eine Mail erhalten haben, und dann solange neu aufgerufen wird, bis alle Mails verschickt wurden.

        Andererseits: Mailserver, insbesondere die bei großen Providern, haben sowieso den ganzen Tag nichts anderes zu tun, als Mails zu verarbeiten. Deine Mails kommen dabei alle in eine Warteschlange und werden nacheinander, wenn nichts anderes zu tun ist, verschickt. Ich würde mir primär Gedanken machen, ob und wie PHP es hinbekommt, mehr als 2000 Mails zu versenden, insbesondere, wenn der Vorgang zwingend den Anstoß jedes Schrittes durch einen Browser benötigt.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
      2. Ansonsten schau dir mal sleep() an..

        1. Ansonsten schau dir mal sleep() an..

          Ja sleep() hör sich doch mal interessant an.
          Werde mal was damit versuchen.

          danke

          1. Moin!

            Ja sleep() hör sich doch mal interessant an.
            Werde mal was damit versuchen.

            sleep() unterbricht die Abarbeitung des PHP-Skriptes für eine gewisse Zeit. Ist diese Zeit aber zu lange, bricht der Browser das Laden der PHP-Seite ab. Und das bricht wiederum dein Versand-Skript ab.

            Inwieweit die Verbindungssteuerung von PHP da hilft, kann ich nicht abschätzen.

            - Sven Rautenberg

            --
            My sssignature, my preciousssss!
            1. Hello,

              Inwieweit die Verbindungssteuerung von PHP da hilft, kann ich nicht abschätzen.

              Die hilft bedingt... bzw man benötigt sie ggf.

              Aber exec() und die Abspaltung von Instanzen hilf auf jeden Fall.

              "Prozesse mit PHP in den Hintergrund stellen" wären die Suchtipps für das Archiv. Wir haben das erst vor ca. vier Wochen erneut diskutiert und erfolgreich testen können.

              Grüße vom Berg

              Tom

              1. Hello,

                Inwieweit die Verbindungssteuerung von PHP da hilft, kann ich nicht abschätzen.

                Die hilft bedingt... bzw man benötigt sie ggf.

                Aber exec() und die Abspaltung von Instanzen hilf auf jeden Fall.

                "Prozesse mit PHP in den Hintergrund stellen" wären die Suchtipps für das Archiv. Wir haben das erst vor ca. vier Wochen erneut diskutiert und erfolgreich testen können.

                http://forum.de.selfhtml.org/archiv/2005/8/t113333/#m719580

                <?php   ### start_dauerlauf.php ###

                echo "<h1>Starte Script</h1>\n";

                $pid=exec("/usr/local/bin/php dauerlauf.php > /dev/null & echo $!");

                echo "<p>Script inter PID $pid gestartet</p>\n";

                ?>

                und der Prozess selber:

                <?php #### dauerlauf.php ####

                #error_reporting(E_ALL);
                session_id('5d951f3e6c1bf3c651c9323b67d3a167');
                session_start();
                ini_set("track_errors","1");
                $php_errormsg ='';

                set_time_limit(0);
                $pid = getmypid();

                $ignore = ignore_user_abort(true);  ## Script läuft bei abort weiter

                touch('prozess'.$pid.'_'.session_id().'.ctl');

                while (file_exists('prozess'.$pid.'_'.session_id().'.ctl'))
                {
                  #$message = "Prozess $pid ".date('Y-m-d H:i:s')." lebt noch<br />\n";
                  #$log =  error_log ( $message, 3, 'lauflog.html');  ## das kann man auch auf einaml pro Stunde
                  sleep(1);                                           ## reduzieren

                ## error_log() verursacht keinen Fehler, wenn Verzeichnis oder File nicht writable sind

                ## In dieser Schleife kannst Du dann die Zeit abfragen, wann Deine Mailversand beginnen
                  ## soll und bei jedem Durchlauf eine Mail versenden. Wenn alle versand sind, kannst
                  ## Du die Schleife mit break verlassen und die Kontrolldatei löschen
                  ## oder (schmutzig) auch gleich das Script mit exit.

                ## hier prüfen, was zu tun ist und dann darüber auch einen Log-Eintrag schreiben
                  ## Die Aufgabe kann man auch über fsockopen() nach dersleben Methode starten
                  ## Nach dem fclose() läuft das Script dann weiter...

                clearstatcache();
                }

                echo "Script $pid beendet<br />\n";  # das landet ggf. sowieso im Device NUL
                ?>

                Harzliche Grüße vom Berg
                esst mehr http://www.harte-harzer.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau