Ausführungszeit von einem Script

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ausführungszeit von einem Script

    Hallo Forum,

    ich erstelle mir grad ein Konzept und hab mal was kleines zusammengebastelt:

    PHP-Code:
    $art_template_file "art.tmpl.htm";
    $art_template_content file_get_contents ($art_template_file);
        echo 
    $art_template_content;

    $row 1;                                     
    $get_csv fopen ("ARTIKEL.CSV","r");             
        while ( (
    $csv_content fgetcsv ($get_csv1000";")) !== FALSE 
            { 
                
    $num count ($csv_content);                      
                
    $row++;                                     
                for (
    $c=0$c $num$c++) {              
                
                
    $marker_artnr $csv_content[0];
                
    $marker_krzbez $csv_content[4];
                
                
    $art_replaced str_replace("###ARTNR###"$marker_artnr$art_template_content);
                
    $data_replaced str_replace("###KRZBEZ###"$marker_krzbez$art_replaced);
                
                @
    unlink($csv_content[0].'.html');
             
                
    touch($csv_content[0].'.html');
                
    $input_geben fopen ($csv_content[0].'.html'"r+");
                
    fputs ($input_geben$data_replaced);
            }
    }
    fclose ($get_csv);


    ?> 
    Wie zu erwarten läuft das Teil 60 Secunden und bricht ab. Welche möglichkeiten habe ich das mit php zu realisieren? In der CSV können unter umständen 50.000 zeilen enthalten sein.

    Vielen Dank

    Manfred

  • #2
    klar, denn

    1. wofür ist die Schleife: for ($c=0; $c < $num; $c++) { ... } ? scheint sinnfrei zu sein.
    2. in der Schleife werden Dateien erstellt/geöffnet, ohne danach geschlossen zu werden

    bei sovielen Schrott, kommt natürlich irgendwann der Timeout

    Kommentar


    • #3
      Danke für Deine Antwort,

      Deine Tipps waren wirklich gut. Konnte das ganze vom Timeout auf 33 sec runtersetzen bei knapp 3700 Datensätzen. Ich habe gemerkt, das unlink von diesen 33 sec ganze 20 für sich in anspruch nimmt. Gibts ne schnellere Lösung als unlink?

      Hier nochmal das beispiel:

      PHP-Code:
       <?

      $art_template_file = "art.tmpl.htm";
      $art_template_content = file_get_contents ($art_template_file);
      echo $art_template_content;

      function utime() {
          $time = explode(" ", microtime());
          $usec = (double)$time[0];
          $sec = (double)$time[1];
          return $sec+$usec;
      }

      $time111 = utime();

      $get_csv = fopen ("ARTIKEL.CSV","r");             
          while ( ($csv_content = fgetcsv ($get_csv, 1000, ";")) !== FALSE ) 
              { 
                  $c++;
                      
                          $marker_artnr = $csv_content[0];
                          $marker_krzbez = $csv_content[4];
                          $marker_artbez = $csv_content[5];
                          
                          $art_replaced = str_replace("###ARTNR###", $marker_artnr, $art_template_content);
                          $krzbez_replaced = str_replace("###KRZBEZ###", $marker_krzbez, $art_replaced);
                          $data_replaced = str_replace("###ARTBEZ###", $marker_artbez, $krzbez_replaced);
                          
                          $filename = $csv_content[0].".html"; 
                          #@unlink($csv_content[0].'.html');
                          touch($csv_content[0].'.html');
                          $input_geben = fopen ($csv_content[0].'.html', "r+");
                          fputs ($input_geben, $data_replaced);
                          fclose ($input_geben);
              }
      fclose ($get_csv);


      $time222 = utime() - $time111;

      echo $time222;


      ?>

      Kommentar


      • #4
        Wieso löscht du die datei überhaupt?
        gruss Chris

        [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

        Kommentar


        • #5
          Gute Frage, an sich.

          Also Dank eurer Tips bekomme ich folgendes Ergebniss:

          Parsetime: 4.45336985588
          Anzahl Dateien: 44604

          War vorher auch mein Fehler, hatte das unter Xampp getestet. Auf dem Produktivserver schaut dann natürlich gleich nochmal anders aus.

          Vielen Dank erstmal!

          Grüße Manfred

          Kommentar


          • #6
            Damit Du beliebig große CSV-Dateien importieren kannst, musst Du dem Server-Timeout ein Schnippchen schlagen.

            Das geht ungefähr so:
            Code:
            <?php
            $offset=(empty($_GET['offset'])) ? 0: $_GET['offset'];
            $dateiname="./import/data.csv";
            
            $f=fopen($dateiname,"r");
            if ($f===false) die("Konnte Datei nicht finden oder öffnen!");
            fseek($f,$offset);
            $feld=fgetcsv($f,4096,";"); // Feldtrenner
            $fertig=false;
            
            if (!feof($f)) 
            {
            	$offset=ftell($f); // merken wie weit die Abbarbeitung vorangeschritten ist
            	// Daten prüfen und gegebenenfalls verändern - $feld[0]=erste Spalte aus der CSV-Datei
            	if ($feld[0]=="") $feld[0]=0;
            	...
            	// Jetzt Query basteln und dann Eintrag in die Datenbank
            	...
            }
            else $fertig=true;
            fclose($f);	
            
            if ($fertig) die("<br>Import beendet.<br><br>Ende der Datei");
            
            if (!$fertig)
            {
            	echo "<script =\"javascript\">self.location=\"$PHP_SELF?offset=".$offset;
            	echo "\"</script>";
            }
            ?>
            Vielleicht hilft es ja dem ein oder anderen.
            Man kann das Gerüst noch beliebig erweitern. Z.B. dauert der Import so noch recht lange, da der Selbstaufruf so nach jeder einzelnen Zeile ausgeführt wird. Das kann man natürlich so anpassen, dass direkt 100 oder 1000 Einträge pro Seitenaufruf gemacht werden oder man orientiert sich an der max_execution_time. Ein wenig sollt ihr aber auch noch zu tun haben

            Kommentar

            Lädt...
            X