Sabine: DB Timeout bei Email absenden

Wie kann ich einen Timeout umgehen, wenn ich aus der Datenbank heraus (sind etwa 4000 DB-Sätze a je eine Email) gleichzeitig die gleiche Email versenden möchte per mail($email, $mail_betreff, $mail_body, $mail_header)?
Und wie verhält es sich mit der Spamauslese von GMX & Co?

  1. Hallo!

    Wie kann ich einen Timeout umgehen, wenn ich aus der Datenbank heraus (sind etwa 4000 DB-Sätze a je eine Email) gleichzeitig die gleiche Email versenden möchte per mail($email, $mail_betreff, $mail_body, $mail_header)?
    Und wie verhält es sich mit der Spamauslese von GMX & Co?

    Da gab's vor ein paar Tagen schonmal eine ähnliche Frage (schau mal im Archiv!).
    Wenn ich mich recht entsinne hieß es da, daß das Skript während des Versand durchläuft (also nicht jedesmal neu aufgerufen wird), und somit bei einer entsprechenden Anzahl zu versendender Mails leicht die MaxExTime erreicht.

    Das kannst du zum Bsp. dadurch umgehen (und das war glaube ich auch in dem anderen Fall der Lösungsvorschlag), daß du die E-Mails in Schüben à x versendest.

    Was den Spam-Schutz der großen Anbieter angeht: das hängt wohl von deiner Domain ab. Ich lande mit meiner zumindest bei web.de immer drin :-( Wenn jemand weiß, wie man das umgehen kann, ich höre!

    Gruß

    Matthias

    --
    ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
    http://www.makaio.de/quotations
    1. Wenne die nötigen rechte hast, kannst es es ja mal hiermit versuchen

      http://de2.php.net/manual/de/function.set-time-limit.php

      1. Hello,

        Wenne die nötigen rechte hast, kannst es es ja mal hiermit versuchen

        http://de2.php.net/manual/de/function.set-time-limit.php

        Und ob Du die Notwendigen Rechte dafür hast, kannst Du mit der Funktion phpinfo() ermitteln. Der Safe_mode darf nicht aktiviert sein und die Funktion 'set_time_limit' darf nicht in der Sperrliste (disable_functions) aufgeführt sein.

        Dann wäre es aber ggf. immer noch möglich, die max_execution_time in einer .htaccess zu ändern, wenn "options +limit" freigegeben ist.

        php_admin_value max_execution_time '0'

        würde dafür sorgen, dass keine Zeitbegrenzug mehr stattfindet.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hello,

          Die Zeile in der .htaccess muss lauten:

          php_value max_execution_time '0'

          dann findet auch trotz safe_mode keine Zeitbegrenzug mehr statt

          getestet habe ich das mit Apache/1.3.27 (Unix) PHP/4.3.8
          In der PHP-Doku ist es falsch beschrieben

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
  2. Hello Sabine,

    da die Frage nun sachon öfter kam, hier meine kliene Musterlösung, um ein Script in den Hintergrund zu stellen und trotzdem nicht die Kontrolle darüber zu verlieren.

    Das Script word nicht abgebriochen, solange im sleben Verzeichnis eine Datei 'lauf.txt' vorhandne ist.
    Das Script läuft endlos weiter, auch wenn das Browserfenster geschlossen wird.
    Das Script legteine Logdatei unter dem Namen lauflog.html an. Dort wird aller zwei Minuten ein Kontrolleintrag hinterlassen.

    Für Die Verwendung als Mail-Treiber kann es natürlich auch in einer DB seine Spuren hinterlassen und die Mails als gesendet markieren.

    Wenn man die Datei lauf.txt löscht, wird das Script angehalten.

    Der Prozess kann auch aktiv sein, wenn _keine_ lauflog.html erzeugt wird. Das liegt dann ggf. daran, dass die Datei im Verzeichnis nicht erstellt werden darf.

    Obwohl bei eingeschaltetem SafeMode eine Warnung kommt, dass set_time_limit() nicht benutzt werden darf, wird das Script ausgeführt.

    Wenn man im Verzeichnis eine .htaccess anlegen darf und die Veränderung von limits erlaubt sind, kann man mittels

    php_value max_execution_time '0'

    die Zeitbegrenzug abschalten.

    ---------------------------------------------------------------------------
    <?php #### background_control.php ####

    error_reporting(E_ALL);
    ini_set("track_errors","1");
    $php_errormsg ='';

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

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

    echo "<p>Schleife gestartet mit $pid</p>\n";
    echo str_repeat(" ", 256);
    flush();
    clearstatcache();

    diese Schleife läuft solange, wie eine Datei lauf.txt vorhanden ist

    while (file_exists('lauf.txt'))
    {
      $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(120);                                        ## reduzieren

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

    ## hier prüfen, was zu tun ist und dann über die Ausführung einen Log-Eintrag schreiben

    ## Die Aufgabe kann man auch über fsockopen() nach derselben Methode starten
      ## Nach dem fclose() läuft das Script dann weiter...
    }

    $log =  error_log ("Prozess $pid wird beendet: ".date('Y-m-d H:i:s')."<br />\n", 3, 'lauflog.html');

    echo "Script $pid beendet<br />\n";
    ?>

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

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