henman: Datei-Upload

hallo alle,

Ich darf ein Script schreiben, dass es Usern ermöglicht, bis zu 50MB große Dateien hochzuladen.
Soweit is das kein Problem. Nun gibt es aber in der php.ini die max_execution_time usw., welche die Ausführungszeit des Scripts beschränken.
Die darf ich nicht ändern.
Kollege meint, es irgendwann in Verbindung mit Javascript gelöst zu haben, findet das Script aber nicht mehr. Wissen tut er es auch nicht mehr genau.
Ich könnt mir da nur vorstellen, dass Javascript nach vielleicht 50 Sekunden nen Refresh auslöst, dabei das Formular nochmal absendet und PHP dann irgendwie den Upload fortführt. Bloß woher weiß PHP dann, dass er bei 50 Byte weitermachen soll und nicht von Anfang an?

Habt ihr einen Wink mit dem Zaunpfahl, wie ich die maximale Ausführungszeit von PHP austricksen kann, ohne in der php.ini etwas zu ändern?

grüße,
henman

--
"Sir! We are surrounded!" - "Excellent! We can attack in any direction!"
  1. Hallo henman,

    Habt ihr einen Wink mit dem Zaunpfahl, wie ich die maximale Ausführungszeit von PHP austricksen kann, ohne in der php.ini etwas zu ändern?

    z.B. mit ini_set().
    (Beachte den Appendix)

    ciao
    romy

  2. Hello,

    soweit ich mich errinnere, ist die max_execution_time nicht verantwortlich für die zeitliche Begrenzung des Uploads. Die zählt erst ab Übergabe der Kontrolle an das Script. Und die erfolgt erst nach beendetem Upload,

    Du hast gegen ganz andere Konfigurationsparameter zu kämpfen

    Das sind erst einmal diejenigen, die mir spontan einfallen, wobei ich bei max_input_time nicht sicher bin.

    Mit JavaScript dürftest Du da wenig beschicken können, da es bei Js bisher keine Methode gibt (ich kenn zumindest keine), die Dir erlaubt, über Datien (in einer Sandbox) auf dem Client zu verfügen. Anderenfalls wäre es sichrelich mittels AJAX und einem emulierten Chunked Upload möglich.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      Du hast gegen ganz andere Konfigurationsparameter zu kämpfen

      Das sind erst einmal diejenigen, die mir spontan einfallen, wobei ich bei max_input_time nicht sicher bin.

      Es ist noch viel schlimmer, als ich immersten Moment dachte:
      Lies Dir http://de3.php.net/manual/en/ini.core.php#ini.post-max-size durch

      • memory-limit killt Dir alle Bestrebungen :-(

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. hallo Tom,

        • memory-limit killt Dir alle Bestrebungen :-(

        nja.. is auf 64M gestellt hier. Trotzdem soll ich nichts in der php.ini und auch nicht mit ini_set() ändern.

        Es ist zum Mäusemelken -,-

        grüße,
        henman

        --
        "Sir! We are surrounded!" - "Excellent! We can attack in any direction!"
        1. Hallo,

          • memory-limit killt Dir alle Bestrebungen :-(

          nja.. is auf 64M gestellt hier. Trotzdem soll ich nichts in der php.ini und auch nicht mit ini_set() ändern.

          welches Problem besteht denn aktuell?

          Hast Du

          geprüft?

          Nochmals: max_execution_time ist für Dein Problem irrelevant. Es könnte allerdings der Webserver sein, der dagegensteuert.

          Freundliche Grüße

          Vinzenz

          1. hallo Vinzenz,

            welches Problem besteht denn aktuell?

            max_input_time ist auf 60 Sekunden beschränkt. Sollte aber ein Kunde eine schlechte Internetverbindung haben und eine große Datei hochladen wollen, könnte es zu Problemen kommen, wenn die Übertragung zu langsam ist.

            beide 128M.
            Da ich den Upload aber auf maximal 50MB beschränke, sollte das mit 64M memory-limit in Ordnung gehen.

            grüße,
            henman

            --
            "Sir! We are surrounded!" - "Excellent! We can attack in any direction!"
            1. Hallo,

              max_input_time ist auf 60 Sekunden beschränkt. Sollte aber ein Kunde eine schlechte Internetverbindung haben und eine große Datei hochladen wollen, könnte es zu Problemen kommen, wenn die Übertragung zu langsam ist.

              Wer nimmt den Request entgegen? Der Webserver, nicht PHP. Das ist also im Webumfeld die Zeit, die PHP Zeit hat, die vom Webserver übermittelten Daten zu parsen.

              Überleg' bitte: Du hast 60 Sekunden und willst 50 MB netto hochladen. Wenn Deine Annahme stimmte: wer hat schon 1 MB/Sekunde Uploadgeschwindigkeit (die dazu ausschließlich für diesen Upload genutzt werden dürfte)? Bei einer DSL-Verbindung mit einem 128 kBit Upstream bekäme man ja noch nicht einmal 1 MB hochgeladen ...

              Wenn überhaupt hast Du dann ein Problem, wenn der Webserver die Request-Abarbeitung abbricht. Wie wäre es mit entsprechenden Tests? Es gibt Software, mit der Du die Bandbreite beschränken kannst, falls Du nicht über entsprechende Hardware verfügst.

              Freundliche Grüße

              Vinzenz

              1. Hi!

                Wer nimmt den Request entgegen? Der Webserver, nicht PHP. Das ist also im Webumfeld die Zeit, die PHP Zeit hat, die vom Webserver übermittelten Daten zu parsen.

                Ich wäre mir da nicht ganz so sicher. Schließlich stellt PHP intern einen (zum Beispiel für PECL-Extensions nutzbaren) Hook zur Verfügung, über den man die bereits hochgeladene Datenmenge abfragen kann. Der ist für Dinge vorgesehen wie eine Progressbar beim Upload.

                wer hat schon 1 MB/Sekunde Uploadgeschwindigkeit (die dazu ausschließlich für diesen Upload genutzt werden dürfte)?

                1,024MB/s gibts ab 16000er DSL. (25er und 50er VDSL haben 5 und 10.)

                Bei einer DSL-Verbindung mit einem 128 kBit Upstream bekäme man ja noch nicht einmal 1 MB hochgeladen ...

                Das sind aber Anschlüsse mit 768KB/s, die abgesehen von ein paar armen Schweinen, langsam aus der Mode kommen.

                Lo!

                1. Hello,

                  1,024MB/s gibts ab 16000er DSL. (25er und 50er VDSL haben 5 und 10.)

                  *ähem*
                  Waren das nicht Mega_bit_?

                  Das entspräche dann also bestenfalls 128kByte pro Sekunde.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                2. Hallo,

                  Bei einer DSL-Verbindung mit einem 128 kBit Upstream bekäme man ja noch nicht einmal 1 MB hochgeladen ...
                  Das sind aber Anschlüsse mit 768KB/s, die abgesehen von ein paar armen Schweinen, langsam aus der Mode kommen.

                  oh, so weit weg von der Gegenwart ist das gar nicht. Auch bei meinem DSL2000 der Telekom hatte ich nur 128k Upstream. Mit dem Wechsel von DSL2000/Telekom zu DSL2000/1&1 erhöhte sich die Upstream-Bandbreite nur wenig, AFAIR auf 192k. Erst jetzt mit einem DSL6000 (mehr geht hier angeblich nicht) habe ich 640k Upstream. Das sind "netto" etwa 60..70kByte/sec. Da geht einige Zeit ins Land, bis ich 50MB hochgeladen habe.

                  Ciao,
                   Martin

                  --
                  Du kannst dem Leben nicht mehr Tage geben.
                  Aber dem Tag mehr Leben.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              2. hallo Vinzenz,

                Wer nimmt den Request entgegen? Der Webserver, nicht PHP. Das ist also im Webumfeld die Zeit, die PHP Zeit hat, die vom Webserver übermittelten Daten zu parsen.

                Überleg' bitte: Du hast 60 Sekunden und willst 50 MB netto hochladen. Wenn Deine Annahme stimmte: wer hat schon 1 MB/Sekunde Uploadgeschwindigkeit (die dazu ausschließlich für diesen Upload genutzt werden dürfte)? Bei einer DSL-Verbindung mit einem 128 kBit Upstream bekäme man ja noch nicht einmal 1 MB hochgeladen ...

                Schachmatt. Ich hab jetzt Feierabend ;) Ist auf jedenfall toll, wieviel Nichtwissen ich in dem Bereich noch habe.

                Kollege meinte nur, ich solle die '60-Sekunden-Regel' beachten, also wie lange ein PHP-Script laufen darf.
                Ist das denn nun überhaupt von Belang beim Datei-Upload?

                grüße,
                henman

                --
                "Sir! We are surrounded!" - "Excellent! We can attack in any direction!"
                1. Hallo,

                  Überleg' bitte: Du hast 60 Sekunden und willst 50 MB netto hochladen. Wenn Deine Annahme stimmte: wer hat schon 1 MB/Sekunde Uploadgeschwindigkeit (die dazu ausschließlich für diesen Upload genutzt werden dürfte)? Bei einer DSL-Verbindung mit einem 128 kBit Upstream bekäme man ja noch nicht einmal 1 MB hochgeladen ...

                  Schachmatt. Ich hab jetzt Feierabend ;) Ist auf jedenfall toll, wieviel Nichtwissen ich in dem Bereich noch habe.

                  Kollege meinte nur, ich solle die '60-Sekunden-Regel' beachten, also wie lange ein PHP-Script laufen darf.
                  Ist das denn nun überhaupt von Belang beim Datei-Upload?

                  ich habe auf einer Shared-Hosting-Umgebung mit meinem privaten Internetzugang getestet:

                  post_file_size: 8M
                  upload_max_file_size: 8M
                  max_execution_time: 30
                  max_input_time: 60

                  Uploadskript praktisch unverändert aus dem PHP-Handbuch. Hochladezeit für eine knapp 8 MB große Binärdatei knapp 6 Minuten. Upload war erfolgreich.

                  Tests mit einr zu Deiner vergleichbaren Umgebung und Bandbreitendrosselung auf Modemniveau überlasse ich gerne Dir :-)

                  Freundliche Grüße

                  Vinzenz

                  1. Hello,

                    ich habe auf einer Shared-Hosting-Umgebung mit meinem privaten Internetzugang getestet:

                    #> post_file_size: 8M
                    post_max_size
                    #> upload_max_file_size: 8M
                    upload_max_filesize

                    max_execution_time: 30
                    max_input_time: 60

                    Laut PHP-Manual steht das Memory-Limit (memory_limit) über allem.

                    Bei reinem binären Filetransfer (unverschlüsselt) ist die max_input_time zu vernachlässigen.
                    Wie es bei merkwürdigen Content-Transfer-Encodings aussieht, weiß ich allerdings nicht.
                    Anders könnte das auch bei https aussehen. Das habe ich bisher aber auch noch nicht verifiziert.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
  3. Hallo,

    Ich darf ein Script schreiben, dass es Usern ermöglicht, bis zu 50MB große Dateien hochzuladen.

    ach du liebe Güte!

    Soweit is das kein Problem. Nun gibt es aber in der php.ini die max_execution_time usw., welche die Ausführungszeit des Scripts beschränken.

    Vermutlich ist max_upload_file_size oder max_post_size eher dein Problem, vielleicht auch schon das Limit des Webservers vornedran.

    Die darf ich nicht ändern.

    Die max_execution_time ist auch wahrscheinlich gar nicht deine Baustelle, denn die beginnt AFAIK erst, wenn der Upload an sich abgeschlossen ist und dein Script gestartet wird. Außerdem zählen I/O-Operationen nicht zur Laufzeit des Scripts.

    Kollege meint, es irgendwann in Verbindung mit Javascript gelöst zu haben, findet das Script aber nicht mehr. Wissen tut er es auch nicht mehr genau.

    Das würde mich auch *sehr* wundern. Ich kann mir nicht vorstellen, wo da ein Lösungsansatz steckt, bin aber neugierig, ob du den Ansatz nochmal ausgraben kannst.

    Ich könnt mir da nur vorstellen, dass Javascript nach vielleicht 50 Sekunden nen Refresh auslöst, dabei das Formular nochmal absendet und PHP dann irgendwie den Upload fortführt. Bloß woher weiß PHP dann, dass er bei 50 Byte weitermachen soll und nicht von Anfang an?

    Gar nicht - es wird eine neue Script-Instanz gestartet und der Upload beginnt von vorn. Wenn Client und Server beide mitspielen, wird der Server möglicherweise melden: "Die ersten 8.2MB hab ich schon im TEMP-Verzeichnis, ich brauch nur den Rest." HTTP/1.1 erlaubt das. Dennoch hast du dann, wenn der Upload endlich beendet ist, mehrere Scriptinstanzen, die darüber herfallen.

    Habt ihr einen Wink mit dem Zaunpfahl, wie ich die maximale Ausführungszeit von PHP austricksen kann, ohne in der php.ini etwas zu ändern?

    Siehe Romys Vorschlag. Ich glaube nur nicht, dass dir das helfen wird.

    Ciao,
     Martin

    --
    You say, it cannot be love if it isn't for ever.
    But let me tell you: Sometimes, a single scene can be more to remember than the whole play.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi!

      Gar nicht - es wird eine neue Script-Instanz gestartet und der Upload beginnt von vorn. Wenn Client und Server beide mitspielen, wird der Server möglicherweise melden: "Die ersten 8.2MB hab ich schon im TEMP-Verzeichnis, ich brauch nur den Rest." HTTP/1.1 erlaubt das.

      Beim Request? Bist du sicher, dass das nicht nur die Response betrifft, die man teilweise anfordern kann? Das würde bedeuten, man kann dem Webserver sein Temp-Verzeichnis vollmüllen mit jeder Menge nicht beendeter Dateiuploads. Und woher soll er wissen, dass der gerade ankommende Request eine Fortsetzung eines alten Requests darstellen soll? Wie erfolgt die Zuordnung ohne einen Session-Mechanismus?

      Lo!

      1. Hallo,

        Wenn Client und Server beide mitspielen, wird der Server möglicherweise melden: "Die ersten 8.2MB hab ich schon im TEMP-Verzeichnis, ich brauch nur den Rest." HTTP/1.1 erlaubt das.
        Beim Request? Bist du sicher, dass das nicht nur die Response betrifft, die man teilweise anfordern kann?

        ähm, hmm ... ich fühle mich ertappt.
        Stimmt, beim Request kann das schon theoretisch nicht gehen. Das hatte ich tatsächlich mit dem Fortsetzen eines Downloads verwechselt; aber da muss der *Client* von sich aus angeben, welchen Teil der Ressource er noch haben will. Sowas beim Request zu realisieren, würde einen zusätzlichen Frage/Antwort-Zyklus erfordern.
        Danke für den Einwand.

        Ciao,
         Martin

        --
        F: Was macht ein Offizier, der in der Nase bohrt?
        A: Er holt das Letzte aus sich heraus.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hello,

          Stimmt, beim Request kann das schon theoretisch nicht gehen. Das hatte ich tatsächlich mit dem Fortsetzen eines Downloads verwechselt; aber da muss der *Client* von sich aus angeben, welchen Teil der Ressource er noch haben will. Sowas beim Request zu realisieren, würde einen zusätzlichen Frage/Antwort-Zyklus erfordern.

          ... den amn aber z.B. mittels eines Java-Applets emulieren könnte.
          Man teilt die Datei in passende Teile, startet eine Session und lädt die Teile hoch. Mittels Head-request kann die Vollständigkeit dr teile überprüft werden...

          Danke für den Einwand.

          Ciao,
          Martin

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de