tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
16
ZUGRIFFE
551
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    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!"

  2. #2
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Moin,

    hast du es schon mal set_time_limit() probiert?
     

  3. #3
    Denfie Denfie ist offline Mitglied Bronze
    Registriert seit
    Aug 2004
    Beiträge
    36
    Da gibt es mehrere Möglichkeiten.
    1. Die einfachste ist du setzt die Ausführungszeit für ein Script einfach höher was aber keine schöne Lösung ist.
    2. 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.
    3. 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ß Dennis
     
    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
    ?>

  4. #4
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    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!"

  5. #5
    holzmensch holzmensch ist offline Mitglied Gold
    Registriert seit
    Jan 2008
    Beiträge
    105
    Zitat Zitat von Denfie Beitrag anzeigen
    1. 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.
    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)
     

  6. #6
    Denfie Denfie ist offline Mitglied Bronze
    Registriert seit
    Aug 2004
    Beiträge
    36
    Zitat Zitat von holzmensch Beitrag anzeigen
    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..
    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.

    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 110i++){
         
    $send = new test($senden_pro_execute);
         
    $send->send(i*$senden_pro_executei*$senden_pro_execute+$senden_pro_execute);

    So hätte ich das in etwa gemacht....
     
    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
    ?>

  7. #7
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    Habe nun mal folgendes zusammen gebaut...

    Meine Klasse:
    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())            
            
    }
        } 
    Mein Aufruf:
    PHP-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($i30);

    Jedoch bekomm ich einen Fehler: Internal Server Error
    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!"

  8. #8
    holzmensch holzmensch ist offline Mitglied Gold
    Registriert seit
    Jan 2008
    Beiträge
    105
    Mach es doch einfach mit nem Meta Refresh:

    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 ) {
            
    mailblabla );
            
    $schritt--;
        }
        
        if( 
    $schritt==) {
            echo 
    '<meta http-equiv="refresh" content="1; url=script.php?s='.($seite+1).'">  ';
        } else {
            echo 
    'fertisch';
        }

    ?>
    Wenn du irgendwas mitzählen willst oder so, dann mach es per Session. Fertig ist's.
     

  9. #9
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    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!"

  10. #10
    holzmensch holzmensch ist offline Mitglied Gold
    Registriert seit
    Jan 2008
    Beiträge
    105
    Zitat Zitat von mtk-flo Beitrag anzeigen
    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)
    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ß
     

  11. #11
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    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!"

  12. #12
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    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!"

  13. #13
    holzmensch holzmensch ist offline Mitglied Gold
    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.
     

  14. #14
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    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('-&gt;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.
     

  15. #15
    holzmensch holzmensch ist offline Mitglied Gold
    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

  1. Antworten: 2
    Letzter Beitrag: 15.12.09, 11:31
  2. Mehrfache Datenausgabe
    Von Gunah im Forum Relationale Datenbanksysteme
    Antworten: 8
    Letzter Beitrag: 20.02.08, 22:56
  3. Skriptausführung aussetzen
    Von FunkyMonkey im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 29.07.07, 20:54
  4. Skriptausführung vor Login ! Wohin damit
    Von reweiss im Forum Linux & Unix
    Antworten: 1
    Letzter Beitrag: 26.05.06, 05:44
  5. Mehrfache Verknüpfung
    Von fruehbeet im Forum Microsoft Windows
    Antworten: 3
    Letzter Beitrag: 21.09.01, 13:57

Stichworte