Basti2: Fehler und Alternative gesucht

Hi,

leider funktioniert mein Script nicht und außerdem weiß ich die Zeit für den Durchlauf nicht abzuschätzen, insofern sind 20 Sekunden grob (und womöglich falsch) geschätzt.

Ich möchte ca. 10000 Datensätze einlesen und verarbeiten und wegen Scripttimeout das Script sich selber aufrufen lassen.

header location geht nicht wegen dem echo-Befehl im Script selber.

Fragen:

  1. Wo ist der Fehler in meinem Script?
  2. Wie kann man das ganze eleganter lösen?

Grüße, Basti

  1. Sorry, habe den ode vergessen, zu posten.

      
    <?php  
    $array = file("test.txt"); // Datei in ein Array einlesen  
    $ende="10000";  
    if ((!isset($zahl)) || ($zahl=""))  
    {  
         $zahl=0;  
    }  
    else  
    {  
         $zahl=$_REQUEST['ablauf'];  
    }  
      
    if (($zahl+100) < $ende)  
    {  
         $ablauf=$zahl+100;  
    }  
    else  
    {  
         $ablauf=$ende;  
    }  
      
    echo ("Datensatz $zahl bis $ablauf<BR>");  
      
      
    for($count = $zahl; $count < $ablauf; $count++)  
    {  
         echo $array[$count];  
         echo"<br>";  
    }  
      
    if ($zahl == ($ende-1))  
    {  
         echo ("Das Script wurde ordungsgemäß ausgeführt");  
         exit;  
    }  
    else  
    {  
         $ablauf++;  
         echo ("<meta http-equiv='refresh' content='20';URL=script.php?ablauf=$ablauf>");//exit;  
    }  
      
    ?>  
    
    
    1. $ende="10000";

      Warum als String?

      if ((!isset($zahl)) || ($zahl=""))

      Woher kommt $zahl? Wenn das wirklich das ganze Script ist, ist $zahl bisher nicht gesetzt. Die Abfrage wäre dann hinfällig und du könntest gleich $zahl setzen.
      Ich seh übrigens keine Verarbeitung, da wirds erst recht schwer was abzuschätzen.

      Und was funktioniert nicht?
      Was soll dabei rauskommen?

    2. Hello,

      <?php

      $array = file("test.txt"); // Datei in ein Array einlesen

      Das dauert schon mal sehr lange...

      $ende="10000";
      if ((!isset($zahl)) || ($zahl=""))
      {
           $zahl=0;
      }
      else
      {
           $zahl=$_REQUEST['ablauf'];
      }

      if (($zahl+100) < $ende)
      {
           $ablauf=$zahl+100;
      }
      else
      {
           $ablauf=$ende;
      }

      echo ("Datensatz $zahl bis $ablauf<BR>");

      for($count = $zahl; $count < $ablauf; $count++)
      {
           echo $array[$count];
           echo"<br>";
      }

      if ($zahl == ($ende-1))
      {
           echo ("Das Script wurde ordungsgemäß ausgeführt");
           exit;
      }
      else
      {
           $ablauf++;
           echo ("<meta http-equiv='refresh' content='20';URL=script.php?ablauf=$ablauf>");//exit;

      Dieses Statement wird erst ausgeführt, wenn die vorigen abgearbeitet sind. Also wird das erst ausgegeben, wenn die obigen Anweisungen ferig sind.

      }

      ?>

        
      Die einzige Möglichkeit, die Du hättest, wäe das per JavaScript vom Client aus immer wieder anzustoßen und dann müsstest Du den User-Abort beachten, damit das alte Script bei einem neuen Request aus demselben Browserfenster nicht mitten in einer Aktion abbricht.  
        
        
      Und schau Dir mal fgetcsv() oder die anderen Dateifunktionen für zeilenweises Lesen an:<http://de.php.net/manual/en/function.fgetcsv.php> und verarbeite Deine Datei zeilenweise.  
        
      Und vermutlich wäre eine Session auch praktischer für Deine Zwecke.  
        
      <http://de.php.net/manual/en/book.session.php>  
        
        
        
        
        
      Liebe Grüße aus dem schönen Oberharz  
        
        
      Tom vom Berg  
      ![](http://selfhtml.bitworks.de/Virencheck.gif)  
        
      
      -- 
       ☻\_  
      /▌  
      / \ Nur selber lernen macht schlau  
      <http://bergpost.annerschbarrich.de>
      
      1. $array = file("test.txt"); // Datei in ein Array einlesen

        Das dauert schon mal sehr lange...

        Ich lese so in einem script z.Z. 66 Dateien mit teilweise gut 30000 Zeilen ein (und verarbeite sie weit aufwendiger), da kommen 40 Sekunden zusammen, für alle Dateien zusammen. Und ich weiß daß das Einlesen nur einen ganz kleinen Bruchteil einnimmt.

        for($count = $zahl; $count < $ablauf; $count++)
        {
             echo $array[$count];
             echo"<br>";
        }

        Es ist nicht auszuschließen, daß das scrippt 100 mal schneller wird, wenn Du, Basti2, ob_start() am Anfang und ob_end_flush() am Ende verwendest. Wobei dann der Speicher der Engpaß werden könnte.

        1. $array = file("test.txt"); // Datei in ein Array einlesen

          Das dauert schon mal sehr lange...

          Ich lese so in einem script z.Z. 66 Dateien mit teilweise gut 30000 Zeilen ein (und verarbeite sie weit aufwendiger), da kommen 40 Sekunden zusammen, für alle Dateien zusammen. Und ich weiß daß das Einlesen nur einen ganz kleinen Bruchteil einnimmt.

          Danke für die Hilfe. Solche Infos sind wichtig, und ich habe das gestern mal für mich auf die Spitze getrieben und eine Datei mit über 45000 Zeilen eingelesen, dann in 1000er-Blöcken je Zeile 2 expolodes (also splits) gemacht, 2-3 if-anweisungen und anschließend die so resultierenden ca. 20 Datenfelder in eine Datenbank eingetragen. Meine Zeit von 20 Sekunden hierfür war jeweils deutlich ausreichend.

          Es ist nicht auszuschließen, daß das scrippt 100 mal schneller wird, wenn Du, Basti2, ob_start() am Anfang und ob_end_flush() am Ende verwendest. Wobei dann der Speicher der Engpaß werden könnte.

          Jo. Dann könnte ich auch wieder darüber nachdenken, über header location zu arbeiten und bräuchte vorab keine Auführungszeit zu schätzen.

          Grüße, Bast

          P.S: An meinem geposteten Code ist übrigens in der Zeile, die den Seitenaufruf anstößt, ein Zeichenfehler (zu viele Anführungszeichen) drin, deshalb funktionierte der nicht.

          1. Danke für die Hilfe. Solche Infos sind wichtig, und ich habe das gestern mal für mich auf die Spitze getrieben und eine Datei mit über 45000 Zeilen eingelesen, ... Meine Zeit von 20 Sekunden hierfür war jeweils deutlich ausreichend.

            Zu solchen Infos kann man auch selber kommen.

            // Zeitmessung am Anfang  
              list($usec, $sec) = explode(" ", microtime());  
              $zeit_start = ((float)$usec + (float)$sec);  
            //  
            ...  
            // Zeitmessung am Ende  
              list($usec, $sec) = explode(" ", microtime());  
              $zeitdauer = ((float)$usec + (float)$sec) - $time_start;  
              echo 'Dauer: '.$zeitdauer.' s';  
            //
            

            Und mit Zwischenzeiten kann man eingrenzen, wo es sich lohnt nach Einsparpotential zu suchen.

            1. '&(%0x#

              Die vorletzte Code-Zeile muß lauten:
              $zeitdauer = ((float)$usec + (float)$sec) - $zeit_start;

            2. Hi!

              list($usec, $sec) = explode(" ", microtime());
                $zeit_start = ((float)$usec + (float)$sec);

              microtime() kennt seit PHP 5.0 den Parameter get_as_float. Wenn man also ein true (oder 1) übergibt, bekommt man die Zeit direkt als float geliefert.

              Lo!

              1. list($usec, $sec) = explode(" ", microtime());
                  $zeit_start = ((float)$usec + (float)$sec);

                microtime() kennt seit PHP 5.0 den Parameter get_as_float. Wenn man also ein true (oder 1) übergibt, bekommt man die Zeit direkt als float geliefert.

                Ah, die Nachteile wiederverwendbarer Programmierung. :-)

  2. Hi,

    Fragen:

    1. Wo ist der Fehler in meinem Script?

    Wo ist die Fehlerbeschreibung in deiner Fragestellung?

    „Funzt nich“ ist keine. Lies </hilfe/charta.htm#tipps-fuer-fragende>

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]