Ankündigung

Einklappen
Keine Ankündigung bisher.

Performance-Problem / Skript bricht ab

Einklappen

Neue Werbung 2019

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

  • Performance-Problem / Skript bricht ab

    Hallo!

    folgendes Skript liest eine CSV-Datei aus und schreibt die Daten in eine MySQL-Tabelle. Leider habe ich das Problem, dass bei größeren CSV-Dateien (>800 kb) das Skript in der While-Schleife "while ($i<count($DataField[0])){", in der der SQL-Befehl generiert wird, stecken bleibt.
    Das Skript ist bei 1und1 gehostet (wg. php.ini-Einstellungen).

    Ich hoffe nun auf Tipps und Ideen, wie ich das Skript optimieren kann, damit es nicht mehr abbricht.

    PHP-Code:
    <?
    error_reporting(E_ALL);
             $Dateizeiger = fopen("Data/$tabelle_gewaehlt/".$_POST['DatenDatei'], "r");
             $z=0;
             $ze=0;
             while(($Daten = fgetcsv($Dateizeiger, 9999, ";")) !== FALSE)
             {
                 $AnzahlSpalten = count($Daten);
                 $sp=0;
                 for($s = 0; $s < $AnzahlSpalten-1; $s++)
                 {
                     if($s==0){
                             $TimeField[] = $Daten[$s];
                     }
                     else if($s>0 && (strpos($Daten[$s],".")!==false)){
                             //Schreibt alle Spalten der Zeile in Array
                             $DataField[$ze][$sp] =  $Daten[$s];
                             $sp++;
                     }
                 }
                 if ($s>0){
                     $ze++;
                 }
                 $z++;
             }
             fclose($Dateizeiger);
             // vorhandene Spalten der Datenbank einlesen
             $sql = "SHOW COLUMNS FROM `$tabelle_gewaehlt`";
             $n=0;
             if ($res = mysql_query($sql)){
                 while ($data = mysql_fetch_array($res)){
                     $felder[$n] = $data['Field'];
                     $n++;
                 }
             }

             //Anzahl der bestehenden Zeilen auslesen, um Zellnummer weitführen zu können
             $sql = "SELECT Count(*) AS Zellzahl FROM `$tabelle_gewaehlt`";
             if ($res = mysql_query($sql)){
                     while ($data = mysql_fetch_array($res)){
                            $zellzahl = $data['Zellzahl'];
                     }
             }

             // Daten in DB schreiben
             $sql = "INSERT INTO `$tabelle_gewaehlt` (";
             for ($n=0; $n<count($felder); $n++){
                     $sql .= "`$felder[$n]`, ";
             }
             $sql = substr($sql, 0, -2);
             $asdf = $n;
             $sql .= ") VALUES (";
             $i=0;
             $zellnummer=$zellzahl+1;
             while ($i<count($DataField[0])){
                     $sql .= "NULL, '$zellnummer', '', '', '', '', '', ";
                     for ($n=0; $n<count($DataField); $n++){
                            $sql .= $DataField[$n][$i].", ";
                     }
                     $sql = substr($sql, 0, -2);
                     $sql .= "), (";
                     $zellnummer++;
                     $i++;
             }
             $sql = substr($sql, 0, -3);
             $sql .= ";";
             echo $sql;
             if (mysql_query($sql)){
                     echo "Daten erfolgreich in Tabelle $tabelle_gewaehlt eingelesen!<br><br>";
             }
             else {
             die(mysql_error().'<hr />'. $sql .'<hr />');
             echo "Fehler beim Einlesen der Daten!<br><br>$sql";}
    ?>
    Vielen Dank und viele Grüße,

    Kai

  • #2
    naja, eine möglichkeit wäre die max_execution_time zu erhöhen..

    schau mal ob 1und1 dir ini_set() erlaubt...:


    PHP-Code:
    ini_set("max_execution_time",300); 

    ansonsten vlt. die datei aufsplitten auf kleinere..?


    lg
    Andi

    Kommentar


    • #3
      Ich würde mir das ja ansehen, aber Dein Coding-Stil ist grausam. Warum benutzt Du nicht mal ab und an ne Leerzeile? Sprechende Variablennamen, einheitliche Syntaxsprache? Tausen .= Operatoren sind nicht nachvollziehbar.

      $sql .= ";";
      Das solltest Du weglassen und dafür lieber mal das letzte INSERT Statenment mit ) schließen.

      Kommentar


      • #4
        Erstmal danke für Eure Beiträge!

        @ DER_Brain: die max_execution_time ist auf 50000 eingestellt. Daran liegt es dann wohl eher nicht, oder? Das Skript bricht außerdem schon nach ca. 5 Sekunden ab.

        @ nikosch: ich werd versuchen, deine Kritik beim weiteren Coden zu beachten. Mir fehlt eben die Routine, um in diesen Dingen immer konsequent zu sein. Wie ich die $sql .= vermeiden soll, weiß ich allerdings nicht. Je nach Anzahl der Spalten in der DB wird der SQL-Befehl doch unterschiedlich oft verlängert, also muss ich mir den in mehreren Schritten zusammenbauen. Hast du eine bessere Idee, die ohne .= auskommt?
        Der INSERT-Befehl wird geschlossen. Nämlich dadurch, dass nach der while-Schleife die letzte offene Klammer und das Komma abgeschnitten wird. ";" ist natürlich überflüssig am Schluss - danke für den Hinweis.

        Kommentar

        Lädt...
        X