ERLEDIGT
NEIN
NEIN
ANTWORTEN
16
16
ZUGRIFFE
551
551
EMPFEHLEN
-
Hallo,
ich habe folgendes Problem:
ich versende eine Menge an Emails an ausgewählte Personen (die auch die Email bekommen möchte).
Jedoch bricht das Script nach eine Zeit ab.
Wie kann ich das Skript mehrfach aufrufen, damit ich die max_execution_time umgehe und das Skript alle Emails versendet?
Ich würde gerne einrichten, dass ich immer 50 Personen eine Email schicke und anschließend, das Skript neu geladen wird und die nächsten 50 Emails verschickt werden.
Das ganze halt so lange, bis alle Emails raus sind.
Vielen Dank schon mal
mtk-flo"Same Shit - Different Day"
"Wege entstehen, indem man sie geht!"
-
Moin,
hast du es schon mal set_time_limit() probiert?
-
Da gibt es mehrere Möglichkeiten.
- Die einfachste ist du setzt die Ausführungszeit für ein Script einfach höher was aber keine schöne Lösung ist.
- Du erstellst dir einen Cron-Job der in einer bestimmten Zeit die Datei aufruft und in einer Datenbank vermerkst du dir, an wen du schon eMails verschickt hast, damit sie nicht doppelt versendet werden.
- Du erstellt dir eine Classe die sich immer wieder selber aufruft, das hilft auch in vielen Fällen. Das machst du solange bis deine ganzen Mails verschickt wurden.
Gruß DennisJedes Programm hat einen Anfang, nur das Ende ist undefiniert.
Drumm lasst uns ein Programm erschaffen, welches sich selber vervollständigen kann. (AI <=> KI)
PHP-Code:<?php class alive {
public function __construct(){
$ai = new alive();
}// end function __construct
} ?>
-
Leider kann ich die max_execution_time nicht erhöhen.
Dies ist leider von Strato so vorgegeben.
Das mit den Cronjobs betreibe ich im Moment, was ich allerdings nicht als Lösung ansehe, sondern nur als Übergangslösung.
Das mit der Klasse habe ich nicht recht verstanden.
Ungefähr so !?
> Funktion
--> erstellt eine Instanz
--> ruft eine Methode auf (sende 50 Emails)
--> am Ende der Methode erstelle ich dann eine neue Instanz?
----> über die neue instanz wird wieder die Methode (sende 50 Emails) aufgerufen!?
Hat jemand ein Code beispiel dafür?
Das Skript läuft dadurch aber weiterhin lange, ich rufe ja mehrere Klassen innerhalb eines Skriptes auf und nicht das Skript an sich neu, oder?!"Same Shit - Different Day"
"Wege entstehen, indem man sie geht!"
-
01.03.10 11:29 #5
- Registriert seit
- Jan 2008
- Beiträge
- 105
Na ob das Hilft,
der Server schaut ja nur wielange ein Script ausgeführt wird und nicht wielange eine Klasse "ausgeführt" (wobei ja Klassen nicht "ausgeführt" werden) wird.
Du schreibst ein Script, dass immer x Emails versendet, nen Location-Header schickt oder einen Meta-Refresh mit einer Schritt-GET-Variablen auf sich selber ausführt. Wenn alles verschickt -> kein Refresh.
PS: habe auch immer so ein Problem gehabt, nur nicht mit Emails, sondern mit so anderen Zeugs. Das Script musste insgesamt vielleicht 10min durchlaufen, ging natürlich auf nem billig Webspace nicht. Habe mir ein AJAX-Gerüst gebaut, dass Scripte ausführt und immer ein Schritt weitergeht, bis eben die Nachricht vom Script kommt, dass er fertig ist.Geändert von holzmensch (01.03.10 um 11:32 Uhr)
-
Es wird zwar schon geschaut wie lange das Script arbeitet aber er kann auch nebenbei Ausgaben machen und wenn ich mich recht erinnere dann wird ein Script erst abgebrochen wenn es zu viele Ausgaben in zu kurzer Zeit macht oder wenn es zu lange dauert bis eine Ausgabe erfolgt.
Jedenfalls hat das bei meinen Scripts immer gereicht und die laufen auch ab und zu 50 Minuten oder so. Eine XML Struktur zu erstellen und dann noch einen FTP upload zu machen ist halt auch Zeitaufwändig.
Einfach mal ausprobieren.
So hätte ich das in etwa gemacht....PHP-Code:class test {
private $max;
public __constructor($max_mails){
$this->max = max_mails;
}
public send($from_is, $to_id){
... senden ...
print("Gesendet ID: ".$id);
}
}
$senden_pro_execute = 30;
for(int i = 1; i < 10; i++){
$send = new test($senden_pro_execute);
$send->send(i*$senden_pro_execute, i*$senden_pro_execute+$senden_pro_execute);
}
Jedes Programm hat einen Anfang, nur das Ende ist undefiniert.
Drumm lasst uns ein Programm erschaffen, welches sich selber vervollständigen kann. (AI <=> KI)
PHP-Code:<?php class alive {
public function __construct(){
$ai = new alive();
}// end function __construct
} ?>
-
Habe nun mal folgendes zusammen gebaut...
Meine Klasse:
Mein Aufruf:PHP-Code:class CEmails {
private $maxKunden = 0;
private $sendeVon = 0;
private $sendeAnzahl = 0;
public function CEmails($_maxKunden) {
$this->maxKunden = $_maxKunden;
}
public function sendeEmails($von, $anzahl = 30) {
$this->sendeVon = $von;
$this->sendeAnzahl = $anzahl;
if($this->maxKunden >= $this->sendeVon)
$this->sendNow();
}
private function sendNow() {
$db_kunde = new CDatenbank();
$db_kunde->open();
$db_kunde->execute("SELECT * FROM kunde LIMIT ".$this->sendeVon.", ".$this->sendeAnzahl.";");
while($kunde_row = $db_kunde->fetch()) {
// ... bereite Emails vor und sende die Emails
} // while($kunde_row = $db_kunde->fetch())
}
}
Jedoch bekomm ich einen Fehler: Internal Server ErrorPHP-Code:include_once("klassen/CEmails.php");
include_once("klassen/CDatenbank.php");
$db_emails = new CDatenbank();
$db_emails->open();
$db_emails->execute("SELECT * FROM kunde");
$kundenAnzahl = $db->zeilenAnzahl;
for($i = 0; $i < $kundenAnzahl; $i+= 30) {
$send = new CEmails($kundenAnzahl);
$send->sendeEmails($i, 30);
}
Was ja bedeutet, dass ich eine Zeitüberschreibung bekommen habe...
Was hab ich falsch gemacht?Geändert von mtk-flo (01.03.10 um 13:21 Uhr)
"Same Shit - Different Day"
"Wege entstehen, indem man sie geht!"
-
01.03.10 13:28 #8
- Registriert seit
- Jan 2008
- Beiträge
- 105
Mach es doch einfach mit nem Meta Refresh:
Wenn du irgendwas mitzählen willst oder so, dann mach es per Session. Fertig ist's.PHP-Code:<?php
$seite = empty($_GET["s"]) ? 1:$_GET["s"]; // in die sql mit limit etc
$schritt = 50; // in die sql mit limit etc
while( blabla ) {
mail( blabla );
$schritt--;
}
if( $schritt==0 ) {
echo '<meta http-equiv="refresh" content="1; url=script.php?s='.($seite+1).'"> ';
} else {
echo 'fertisch';
}
?>
-
Ja werde ich dann auch mal ausprobieren,
aber gefallen tut mir die Lösung mit dem META-Refresh nicht...
Ist nicht elegant und nur ein weiterer Work-Around (ähnlich wie meine Cronjob Lösung)"Same Shit - Different Day"
"Wege entstehen, indem man sie geht!"
-
01.03.10 13:38 #10
- Registriert seit
- Jan 2008
- Beiträge
- 105
Eine "nicht-Work-Around"-Lösung wirst du aber wohl kaum hinkriegen, solange du die php.ini nicht bearbeiten kannst. Ist dir ja hoffentlich klar? Diese Methode mit dem AJAX - Aufruf finde ich persönlich perfekt. Habe in meinem Script auch sowas eingebaut, dass er es sagen wir mit 50 Datensätzen probiert -> wenn timeout -> das selbe mit 40 Datensätzen -> wenn geklappt, dann die nächsten 40 Datensätze, wenn nicht -> 30 Datensätze probieren.
Finde ich persönlich sehr angenehm. Man kriegt keine dämlichen Refreshes, hat eine schöne "Wird bearbeitet" Anzeige und alles auf einem Fleck.
Gruß
-
Dann werde ich das noch mal probieren...
Vielen Dank schon mal!
Wie ist der Fehlercode von AJAX wenn es ein Timeout gab?
200 ist ja alles OK... oder prüfst du einfach auf != 200 ab?!"Same Shit - Different Day"
"Wege entstehen, indem man sie geht!"
-
Habe das mit dem Ajax nun mal ausprobiert...
Funktioniert auch super, nur gibt es auch ne Möglichkeit, das Ajax-Skript automatisiert anzustoßen?
Ohne dass ich klicken muss?
Per Cronjob funktioniert dies nicht, da der Server anscheinend kein JavaScript unterstützt."Same Shit - Different Day"
"Wege entstehen, indem man sie geht!"
-
04.03.10 14:01 #13
- Registriert seit
- Jan 2008
- Beiträge
- 105
Ähm, ja das war ja klar, dass es per Cron nicht funktioniert. Ist eben eine Möglichkeit, sowas wie ein Newsletter abzuschicken via 1Klick.
Ich wüsste jetzt ehrlich gesagt nicht, wie du das "geschickt" Lösen könntest, außer eben diese eine Möglichkeit mit verschickte Emails markieren und den Cron jede Minute aufzurufen, was aber auch Quick&Dirty ist. Ich kann dir da leider nicht weiterhelfen, hoffe aber jmd anders, würde mich auch interessieren.
-
Moin, hier mal ne simple AJAX-Variante(mit jquery):
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <meta name="author" content="doktormolle" /> <meta name="date" content="2010-03-04" /> <title>Test</title> <script src="http://code.jquery.com/jquery-latest.js"></script> <script type="text/javascript"> <!-- function fx(id) { $('#msg').append('<br/>Request ID#'+id); $.post( 'mailSendeSkript.php', {id:id}, function(data) { if(data) { $('#msg').append('->done'); if(data.id) { fx(data.id); } else { $('#msg').append('<br/><strong>complete</strong>'); } } }, 'json' ); } //--> </script> </head> <body> <a onclick="fx(1);return false;" href="#">Klick</a> <div id="msg"></div> </body> </html>
Die angefragte Datei(hier mailSendeSkript.php) gibt einen JSON-kodierten String zurück, welcher als Member id hat...id ist die ID des nächsten Datensatzes, der noch nicht geholt wurde(kannst da ja einfach die ID des letztgeholten Datensatzes +1 nehmen)
Wenn keine Datensätze mehr da sind, muss id im JSON den Wert NULL haben(oder 0 )
Hier eine Simulation wie es arbeitet: (mailSendeSkript.php)
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
<?php //$id per POST übergeben, ID des 1.zu selektierenden Datensatzes $id=( isset($_POST['id']) && intval($_POST['id']) )?intval($_POST['id']):1; //kleine Simulation if($id<100) { //Hier macht dein Skript, was es zu tun hat sleep(2); //Rückgabe ist ein JSON-String mit Member id, //der id des Datensatzes, bei dem das nächste SELECT starten soll die(json_encode(array('id'=>($id+10)))); } //Falls nix mehr in DB, für ID NULL zurückgeben->ENDE die(json_encode(array('id'=>NULL))); ?>
Die fx()-Funktion wartet halt auf die Rückgabe des Skriptes, und wenn die ID nicht NULL (false) ist, ruft sie sich selbst wieder auf mit der ID aus der Serverantwort.
-
04.03.10 15:17 #15
- Registriert seit
- Jan 2008
- Beiträge
- 105
Ja ist ja alles schön und gut, aber nicht der Gegenstand der Verhandlung.
Es geht darum ein Cron auf dem Script laufen zulassen, der Threadersteller hat ja schon mitgeteilt, dass er via Ajax hinbekommen hat.
Ähnliche Themen
-
[Dojo Toolkit] Skriptausführung warten lassen, bis der Inhalt der ContentPane gelade
Von marcel_m im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 15.12.09, 11:31 -
Mehrfache Datenausgabe
Von Gunah im Forum Relationale DatenbanksystemeAntworten: 8Letzter Beitrag: 20.02.08, 22:56 -
Skriptausführung aussetzen
Von FunkyMonkey im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 29.07.07, 20:54 -
Skriptausführung vor Login ! Wohin damit
Von reweiss im Forum Linux & UnixAntworten: 1Letzter Beitrag: 26.05.06, 05:44 -
Mehrfache Verknüpfung
Von fruehbeet im Forum Microsoft WindowsAntworten: 3Letzter Beitrag: 21.09.01, 13:57





Zitieren

Login






[PHP][Snippet] Array zu XML konvertieren