DB Timeout bei Email absenden
Sabine
- php
0 Matthias Jütte0 Tom
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?
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
Wenne die nötigen rechte hast, kannst es es ja mal hiermit versuchen
http://de2.php.net/manual/de/function.set-time-limit.php
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
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
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();
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