Mehrfache Skriptausführung

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?!
 
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.
 
Ä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:
<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:
<?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.
 
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.
 
Dann sollte Folgendes möglich sein, Vorgehen eigentlich identisch zu der AJAX-Lösung.

Skript A(aufgerufen per Cronjob) sendet keine Mails, es fragt nur per stream(fsockopen etc.) Skript B ab, übergibt dabei wieder die ID des nächsten Datensatzes.
Skript B holt x Datensätze, und antwortet mit der ID des nächsten Datensatzes....Skript A führt den nächsten Request aus wieder mit der ID als Parameter....uswusf.

Dass Skript B nicht zu lange läuft, kann man ja steuern z.B. über Erfahrungswerte bei den in 30sec verarbeitbaren Datensätzen/Mails

Skript A wird nicht zu Lange laufen, da die Zeit, bis die Antwort auf die Anfrage kommt, nicht zur Skriptlaufzeit zählt.
 
Hier das PHP-Äquivalent: (hab mal alles Beschriebene in eine einzige Datei gepackt)
Code:
<?php
  //HTTP-Adresse ...anpassen!
  $http='http://example.com/skript.php';

    //Skript B, per HTTP angefordert, id als Parameter
  if(!empty($_GET['id']) && intval($_GET['id']))
  {
    $id=intval($_GET['id']);
    
      //kleine Simulation
      if($id<100)
      {
        //Hier macht dein Skript, was es zu tun hat
        sleep(40);
        //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)));
  }
    //Skript A, per Cronjob aufgerufen
  elseif(!isset($_GET['id']))
  { 
    
    $start=time();
    $ex=0;
    $id=1;
    echo '<pre>Request ID#'.sprintf("%3.6d",$id);
    flush();
    while($id && $f=file_get_contents($http.'?id='.$id))
    {
      $now=microtime(true);
      flush();
      $f=json_decode($f);
      if(is_object($f) && !empty($f->id))
      {
        $id=$f->id;
        echo '-&gt;Done(Run-Time:'.sprintf("%4d",time()-$start).'sec/Execution-Time:'.sprintf("%1.6f",$ex).'sec)</pre><pre>Request ID#'.sprintf("%3.6d",$id);
        $ex+=sprintf("%1.6f", (microtime(true)-$now));
      }
      else
      {
        $ex+=sprintf("%1.6f", (microtime(true)-$now));
        die('-&gt;Done(Run-Time:'.sprintf("%4d",time()-$start).'sec/Execution-Time:'.sprintf("%1.6f",$ex).'sec)</pre><strong>Complete</strong>');
      }
    }
  }
  

?>

...beim Testen kann man gut beobachten, dass da noch seeeeeehr viel Zeit übrig bleibt :)
 
Zurück