Umgehen von HTTP TimeOut durch mehrmaliges Scriptausführen

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

  • Umgehen von HTTP TimeOut durch mehrmaliges Scriptausführen

    Hallo zusammen,

    ich habe seit langem mal wieder ein Problem andem ich richtig festsitze und nicht weiterkomme.

    Problem: ich lese Dateinamen aus einer SQL Datenbank aus. Die daraus resultierenden Dateien packe ich mittels einer ZIP Klasse in ein ZIP. Das funktioniert wunderbar bis zu einer Dateigröße von ca. 250MB, wo die Scriptausführung solange braucht, dass der HTTPD Timeout von 300 Sekunden (vermute ich) überschritten wird und das Script abbricht. (httpd.conf darf ich nicht ändern)

    Infos zum Server:

    PHP Version: 4.4.
    register_globals = ON
    safe_mode = OFF
    time_limit = 9999
    max_execution_time = 9999
    memory_limit = 1000M

    Das Script:
    PHP-Code:
    <?
    error_reporting(E_WARN);
    ini_set("memory_limit","1000M");
    ini_set("max_execution_time","9999");
    ini_set("max_input_time","9999");
    set_time_limit("9999");

    include(dirname(__FILE__) . "/config/dbase.php");
    include(dirname(__FILE__) . "/classes/mysqlBase.class.php");
    include(dirname(__FILE__) . "/classes/mysql.class.php");
    include(dirname(__FILE__) . "/classes/settings.class.php");
    include(dirname(__FILE__) . "/classes/zipBase.class.php");
    # Klassen
    $_db  =  new mysql();
    $_zip =  new zipfile;
    $myid = $_REQUEST['id'];
    $getPics = $_db->query("SELECT FilePath, FileName FROM tblPictures WHERE AlbumId = '$myid'");
    $i=0;
    while($db = $_db->fetch_array($getPics))
    {
    $mypath = str_replace("./","/var/www/vhosts/mydom/subdomains/test/httpdocs/new/",$db[FilePath]);
    $i = $i + 1;
    echo $i." Processing File:".$db[FileName]."<br>";
    flush();
    }
    $file = dirname(__FILE__) . "/zipped/zip_$myid.zip";
    $zipfile = fopen ($file, "a+");
    fwrite($zipfile,$_zip->file());
    echo "done :)";
    ?>
    Ich habe bereits die Suche bemüht, da ich den selben Gedanken mit der mehrmaligen Scriptausführung hatte und habe folgenden Thread gefunden: [Funktion] PHP-Script bricht immer ab 1&1

    Leider schaffe ich es nicht die Lösung von Damian1984 für meine Problemstellung anzupassen und benötige deshalb eure Hilfe.

    Die ZIP Klasse ist übrigens aus der ZEND Libary von Eric Müller.

    Ziel soll sein, auch ZIPs bis zu 1000MB erzeugen zu können, ohne das das Script abbricht. Man sollte auch schön sehen können (wie es jetzt ist), welche Datei aktuell bearbeitet wird.

    Ein Alternativansatz an dem ich auch gescheitert bin, wäre einen tar Befehl über system() an den Server zu senden. Vorteil wäre das unbegrenzt große Dateien erzeugt werden können. Allerdings ist mir das tar Format nicht so lieb und ich weiß nicht, wie ich die Daten aus dem MySQL Array hintereinander anordne um sie in einer Variable in den System(tar ...) Befehl zu geben.

    Ich wäre für jegliche Hilfe & Lösungsansätze sehr dankbar,

    Viele Grüße
    DuRoX

  • #2
    Re: Umgehen von HTTP TimeOut durch mehrmaliges Scriptausführen

    set_time_limit(0); = unendlich
    error_reporting(E_ALL); = gibt Auskunft darüber ob es wirklich an einem timeout hängt

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Re: Re: Umgehen von HTTP TimeOut durch mehrmaliges Scriptausführen

      Original geschrieben von ghostgambler
      set_time_limit(0); = unendlich
      error_reporting(E_ALL); = gibt Auskunft darüber ob es wirklich an einem timeout hängt
      Hallo ghostgambler,

      danke für deine Antwort.

      Ich habe den Code entsprechend geändert. Die Daten werden alle processed, also die Schleife läuft durch aber dann passiert nichts mehr und das entscheidende "done" kommt nicht. Auch keine Fehlermeldung erscheint (außer die Notices, das habe ich behoben).

      Woran könnte das liegen?

      Oder könntest du mir direkt erklären, wie ich dieses Script mehrfach durchlaufen lasse?

      Oder alternativ wie ich Dateinamen aus der MySQL Datenbank nacheinander in einen String einlesen kann um daraus einen system() tar Befehl zu bauen.

      so z.B. : $mystring = "data1.jpg data2.jpg data3.jpg"; ...

      Viele Grüße
      DuRoX

      Kommentar


      • #4
        Guck mal in das apache-Log/php-Log, vielleicht kommt ein segfault (warum auch immer)

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Original geschrieben von ghostgambler
          Guck mal in das apache-Log/php-Log, vielleicht kommt ein segfault (warum auch immer)
          Hallo,

          nein kommt auch nicht. Einfacher wäre es das ganze über ein den System Befehl zu regeln wozu ich jedoch die o.g. Frage beantwortet haben müsste

          Kommentar


          • #6
            PHP-Code:
            $result mysql_query(...);
            $strings = array();
            while (
            $row mysql_fetch_assoc($result)) {
              
            $strings[] = $row['string'];
            }

            echo 
            implode(' '$strings); 
            oder auch
            PHP-Code:
            $result mysql_query(...);
            $strings '';
            while (
            $row mysql_fetch_assoc($result)) {
              
            $strings .= $row['string'] . ' ';
            }
            $strings substr($strings0strlen($strings)-1);
            echo 
            $strings 

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Hallo DuRoX,
              momentan bin ich selber bei sowas bei.
              Hab es folgendermaßen wunderbar gelöst.

              Ich binde auf eine Seite 2 iframes ein.

              Vorher speicher ich das Object der class in
              $_SESSION['obj']['import'] = new import();

              iframe nr1.
              In diesem iframe lasse ich das Programm laufen.
              Im head bereich der Datei steht:
              echo "<meta http-equiv=\"refresh\" content=\"1\">\n";

              Das Programm läuft aber ganz oben.
              In der class überprüfe ich die Laufzeit.
              Wenn 20 sec. erreicht wurden, dann speicher ich den zwischenstand ab.
              Nach 1.sec wird es wieder aufgerufen und so weiter...

              iframe nr. 2
              Diehnt zur Anzeige von Programminformationen wärend und nach der Laufzeit.

              Viel Spaß.. ;-)
              Gut geraten ist halb gewußt.

              Kommentar


              • #8
                Hallo,

                danke für die Antworten. Haben mir wirklich geholfen!

                Dank ghostgambler funktioniert es jetzt mit Tar.

                Eine kleiner Schönheitsfehler bleibt jedoch zurück: beim generieren des Tars wird die Ordnerstruktur des Servers übernommmen im Archiv, was nicht so schön ist. Ich habe keine Möglichkeit gefunden, dass nur die reinen Dateien in das Archiv übernommen werden - ohne Ordnerstruktur. So sieht ein Tar Befehl im PHP Script aus:

                PHP-Code:
                $action system("tar -cvf ".$cfg['absolutepath']."zipped/tar_".$AlbumId."_".$final_name.".tar ".$strings.$file_1 $file_2"); 
                Weiß jemand Rat, wie man den Shell Aufruf verändern muss, um nur die Dateien ins Archiv zu laden? In der tar help habe ich nichts gefunden

                Viele Grüße
                DuRoX

                Kommentar


                • #9
                  vielleicht
                  --no-recursion
                  ?
                  probier mal aus, war das einzige was ich jetzt spontan gefunden hab~

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    Original geschrieben von ghostgambler
                    vielleicht
                    --no-recursion
                    ?
                    probier mal aus, war das einzige was ich jetzt spontan gefunden hab~
                    PHP-Code:
                    $action system("tar -cvf --no-recursion ".$cfg['absolutepath']."zipped/tar_".$AlbumId."_".$final_name.".tar ".$strings.$file_1 $file_2"); 
                    So siehts jetzt bei mir aus. Ergebnis ist, dass die Dateien zwar wie gewohnt im Browser angezeigt werden, jedoch überhaupt kein Archiv mehr abgespeichert wird auf dem Server.

                    Kommentar

                    Lädt...
                    X