Schwager Bernd: Riesendateien hochladen

Hallo,

auf meiner Webseite kann man Fotos hochladen, die dann von PHP verkleinert werden, wenn nötig.

Nun gibt es aber Spezialisten, die versuchen, 7 MB hochzuladen. Bekannterweise geht das Hochladen deutlich langsamer als der Download. Es klappt nicht, solche Bilder kommen nicht an. Vermutlich weil PHP timeout erkennt.

Frage:
Bremst das Hochladen eigentlich den Linux- Server aus, ist der nun 10, 20 Sekunden für andere Anfragen gesperrt? Moment, das könnte ich ja selbst testen ... Nein, eine andere Seite wird ausgeliefert.

Kann PHP beim Start eines Uploads die Größe erkennen und ggf. mit einem Fehlerhinweis abbrechen?

Wenn ja, wie geht das?

Gruß, Schwager Bernd

  1. Kann PHP beim Start eines Uploads die Größe erkennen und ggf. mit einem Fehlerhinweis abbrechen?

    Ja, da schon vor dem Senden der Datei der entsprechende Content-Lenght-Header verfügbar ist. Google hilft Dir weiter.

    Gruß, LX

    --
    RFC 2324, Satz 7 (Sicherheit): Jeder, der zwischen meinem Kaffee und mir steht, gilt als unsicher.
    1. Hallo,

      Kann PHP beim Start eines Uploads die Größe erkennen und ggf. mit einem Fehlerhinweis abbrechen?
      Ja, da schon vor dem Senden der Datei der entsprechende Content-Lenght-Header verfügbar ist.

      und dennoch nein, weil das PHP-Script erst gestartet wird, wenn der Upload abgeschlossen ist.

      Ciao,
       Martin

      --
      Ein guter Lehrer muss seinen Schülern beibringen können,
      eine Frage so zu stellen, dass auch der Lehrer lernen muss,
      um die Frage beantworten zu können.
        (Hesiod, griech. Philosoph, um 700 v.Chr.)
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hi!

    Nun gibt es aber Spezialisten, die versuchen, 7 MB hochzuladen. Bekannterweise geht das Hochladen deutlich langsamer als der Download. Es klappt nicht, solche Bilder kommen nicht an. Vermutlich weil PHP timeout erkennt.

    PHP ist in der Lage, Fehlermeldungen in Logfiles schreiben zu können. Siehe Error Handling Runtime Configuration error_log und log_errors. Das könntest du ja mal aktivieren um genauer zu sehen, was die Ursache ist. Es kann auch am Speicherlimit liegen, so dass die Grafik zwar hochgeladen werden konnte, aber nicht geöffnet werden kann, denn dieser Vorgang nimmt deutlich mehr Speicher in Anspruch als die Datei groß ist. Hintergrund ist, dass die Grafiken zum Bearbeiten dekomprimiert werden. Und dann kann der Speicherverbrauch auch noch ein Vielfaches davon sein, weil die Bearbeitung das erfordert.

    Bremst das Hochladen eigentlich den Linux- Server aus, ist der nun 10, 20 Sekunden für andere Anfragen gesperrt? Moment, das könnte ich ja selbst testen ... Nein, eine andere Seite wird ausgeliefert.

    Aktuelle Betriebssysteme für Server beherrschen Multitasking.

    Kann PHP beim Start eines Uploads die Größe erkennen und ggf. mit einem Fehlerhinweis abbrechen?

    Ein PHP-Script wird erst dann gestartet, wenn der Request vollständig beim Server angekommen ist. Sonst müssten sich Scripte auch noch mit unvollständigen Daten rumschlagen, und es müsste einen Mechanismus geben, der das Vorliegen weiterer Daten signalisiert.

    Es gibt zwar die Möglichkeit, in den Upload-Prozess einzugreifen, aber das steht nur PHP-Erweiterungen zur Verfügung.

    Lo!

  3. Hallo Bernd,

    auf meiner Webseite kann man Fotos hochladen, die dann von PHP verkleinert werden, wenn nötig.

    Nun gibt es aber Spezialisten, die versuchen, 7 MB hochzuladen. Bekannterweise geht das Hochladen deutlich langsamer als der Download. Es klappt nicht, solche Bilder kommen nicht an. Vermutlich weil PHP timeout erkennt.

    das glaube ich nicht. Vermutlich eher, weil das Speicherlimit überschritten wird. Für 15-Millionen-Pixel-Bilder (als Beispiel) benötigt die GD rund 75 MB, siehe Archiv.

    Lokalisiere zuerst das tatsächlich auftretende Problem.

    Freundliche Grüße

    Vinzenz

  4. Hello,

    auf meiner Webseite kann man Fotos hochladen, die dann von PHP verkleinert werden, wenn nötig.

    Nun gibt es aber Spezialisten, die versuchen, 7 MB hochzuladen. Bekannterweise geht das Hochladen deutlich langsamer als der Download. Es klappt nicht, solche Bilder kommen nicht an. Vermutlich weil PHP timeout erkennt.

    Ich habe da immer noch eine Baustelle offen, aber aus den Fundamenten kannst Du schon die wichtigsten Zusammenhänge erkennen:

    http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload

    Der Webserver muss selbstverständlich während des gesamten Uploads eine Verbindung dafür opfern. Aber ein Apache hält typischerweise 150 davon für parallele Operationen (Request/Response) bereit.

    Welche Last das dem Server bereitet, müsstest Du mal mit ProcessStatus (ps) nachschauen. Der Host wird bei üblichen Uploadraten zwischen den Paketen garantiert noch genügend Zeit für andere Dinge finden.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  5. Die Entwickler von PHP haben es typischerweise nicht für nötig befunden, das Merkmal umzusetzen, Uploads frühzeitig abbrechen/verhindern zu können. Die Leidtragenden sind wie immer die Anwender, d.h. die Programmierer, welche diese armselige Sprache benutzen müssen.

    Im Gegensatz dazu geht das in mod_perl selbstverständlich.

    1. Hello,

      Die Entwickler von PHP haben es typischerweise nicht für nötig befunden, das Merkmal umzusetzen, Uploads frühzeitig abbrechen/verhindern zu können. Die Leidtragenden sind wie immer die Anwender, d.h. die Programmierer, welche diese armselige Sprache benutzen müssen.

      Im Gegensatz dazu geht das in [mod_perl](http://perl.apache.org/docs/2.0/user/handlers

      /http.html#PerlHeaderParserHandler) selbstverständlich.

      Was hast Du gegen die Konfigurationseinstellung "upload_max_filesize" einzuwenden?

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Die Entwickler von PHP haben es typischerweise nicht für nötig befunden, das Merkmal umzusetzen, Uploads frühzeitig abbrechen/verhindern zu können.
        Was hast Du gegen die Konfigurationseinstellung "upload_max_filesize" einzuwenden?

        Dass sie witzlos ist und nicht hilft? Diese Einstellung kommt zum Tragen, wenn mod_php ausgeführt wird. Dann ist es bereits zu spät, der komplette HTTP-Request-Body wurde bereits übertragen.

    2. hi,

      Du schreibst gute Beiträge und gibts gute Hinweise!

      [..]Die Leidtragenden sind wie immer die Anwender, d.h. die Programmierer, welche diese armselige Sprache benutzen müssen.

      Den finde ich besonders gut.

      Im Gegensatz dazu geht das in mod_perl selbstverständlich.

      Und den auch. Vielen Dank!
      Hotti

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  6. Danke.

    Ich frage jetzt die Fehler ab und gebe eine Meldung aus.

    Ist es richtig,
    wenn ( $_FILES['file_bild0']['error'] == UPLOAD_ERR_INI_SIZE )
    dann   $_FILES['file_bild0']['size'] gleich 0?

    Also kann ich keine Info gewinnen, wie groß die falsche Datei ist?

    Würde gerne anzeigen:
    Datei ist 7MB groß, max. 2MB sind zulässig.

    Schwager Bernd