Apache2 Proxy PHP-FPM -> File Upload Problem

  • So, eigentlich ist es kein Upload-Problem, denn der geht, ist eher ein "Error-Reporting"-Problem.

    "Max Post Size" und "Max Upload Size" stehen auf 8MB, "Form Size" auf 7 MB, das als Info vorab.

    So, lade ich nun ein Bild mit 6 MB hoch, dann funktioniert das fehlerfrei.

    Lade ich aber eines mit knapp 18 MB hoch, dann müsste eigentlich bei $_FILES ein entsprechender Error-Wert gesetzte werden. 1 für UPLOAD_ERR_INI_SIZE und 2 für UPLOAD_ERR_FORM_SIZE bzw. eben einer von beiden.

    Fakt ist, es passt genau gar nichts. Der Upload geht durch, der POST wird beendet und die eigentlich POST-Seite wird einfach nur aufgerufen. Keine sichtbaren Meldungen. Es kommt dann weder $_POST noch $_FILES dort an. Wenn ich das ausgeben will, sind beide leer. Bei einem normalen Bild, das kleiner als 8 MB ist, sind beide Arrays gefüllt.

    Im Error-Log steht dann aber:

    Code
    [Mon Aug 15 18:19:25.307283 2016] [proxy_fcgi:error] [pid 18787:tid 140179486443264] [client 188.xx.xx.xx:61200] AH01071: Got error 'PHP message: PHP Warning:  POST Content-Length of 18463169 bytes exceeds the limit of 8388608 bytes in Unknown on line 0\n', referer: /index.php?mod=bildergalerie&do=upload

    So, er weiß also, dass die Datei zu groß war, schafft es aber nicht mehr, das dann auch vom Script anzeigen zu lassen bzw. die beiden Arrays zu "übergeben". Und dass er das Script nicht kennt, wo den Fehler auslöst ist auch seltsam.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Siehst du falsch,
    soweit ich weiss wird gibt es da keinen Error Wert.
    Sei froh das du soviele Daten hast.
    Ich wühle mich grade bei PHP7-FMP durch. Ein Trauerspiel.

    wenn etwas möglich erscheint mach ich das, wenn das nicht klappt gehts ans unmögliche und ansonsten das undenkbare.

    - nun stolz rauchfrei - Ich denke also Bing ich!

    Support 24h Bereitschaft 0173 6107465 - NUR Für Kunden von SEO NW!

  • Ah, hab es auch wenn es doof ist, sehr doof..... Wenn das Bild größer als post_max_size ist, dann gibt es keine Rückgabe. Die Rückgabe gibt es nur, wenn es zwischen upload_max_filesize und post_max_size liegt.

    Sollte mal wieder öfter das PHP-Handbuch lesen....
    "Wenn die Größe der POST-Daten größer ist als post_max_size, werden die *** Link veraltet *** und *** Link veraltet *** *** Link veraltet *** leer sein."

    Hm, dann war der Fehler quasi schon mehrere Jahre auf meinem alten System. Teste jetzt wohl gründlicher als vorher .:pirat:

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Alex, natürlich gibt es da Error-Werte:

    //Wert: 0 UPLOAD_ERR_OK Es liegt kein Fehler vor, die Datei wurde erfolgreich hochgeladen.
    //Wert: 1 UPLOAD_ERR_INI_SIZE Die hochgeladene Datei überschreitet die in der Anweisung upload_max_filesize in php.ini festgelegte Größe.
    //Wert: 2 UPLOAD_ERR_FORM_SIZE Die hochgeladene Datei überschreitet die in dem HTML Formular mittels der Anweisung MAX_FILE_SIZE angegebene maximale Dateigröße.
    //Wert: 3 UPLOAD_ERR_PARTIAL Die Datei wurde nur teilweise hochgeladen.
    //Wert: 4 UPLOAD_ERR_NO_FILE Es wurde keine Datei hochgeladen.

    Allerdings hatte ich das noch nie mit so großen Testdateien versucht, wegen der Anbindung. Jetzt flutscht das durch und es viel erstmalig auf.

    Das mit Deinem FPM und PHP7 habe ich vorhin gelesen. Hatte auch schon geantwortet und es dann wieder verworfen. Das "bessere Linux" ging mir da echt gegen den Strich, da es einfach so in den Raum geworfen ist, ohne Belege.

    Aber dennoch. Du hast Probleme mit den Ports. Warum brauchst Du denn überhaupt Ports? Die Nutzung vom TCP-Socket ist total veraltet und sollte nicht benutzt werden, nur, wenn man die Pools oder einen davon auf eine andere Maschine auslagern will. Lokal braucht man die nicht. Gehe über den Unix-Socket, da gibt es keine Ports und vor allem auch wesentlich weniger bis keinen Overhead.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Ja doch, Sinn kann es schon machen, denn es wird ja bei einem Post nicht nur der Upload per POST geschickt, sondern auch noch andere Daten. PHP default ist z.B. upload 4mb, post 12MB. Der andere Sinn eben, dass man eine Rückmeldung bekommt.

    Das Upload-Limit ist ja quasi nur eine Sperre mit Rückmeldung.
    Das Post-Limit ist auch eine Sperre, aber hat ja mit Upload nicht unbedingt was zu tun. Fast jedes Formular ist POST. Es hat aber keine Rückmeldung, sondern verwirft einfach.

    Wenn der Upload dann aber das Postlimit überschreitet, dann gibt es keine Fehlermeldung im Script, nur im Log. Übersteigt es nur das Upload-Limit, dann hat man die Fehlermeldungen, können ja verschiedene sein.

    Man muss also einen vernünftigen Mittelweg finden um a) größere Files zuzulassen um dem User eine Meldung geben zu können und b) das Post-Limit dennoch so gering zu halten, dass man nicht den Server "zu-postet".

    Muss also mein Script überdenken, dass ich auch leere $_FILES entsprechend mit Fehlermeldungen quittiere.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Und geht auch:

    18 MB Testbild mit Error-Code 2. Post-Limit steht jetzt auf 25MB.

    Er meldet also UPLOAD_ERR_FORM_SIZE überschritten, das sind die aus der Formular-Angabe, die 7000000. Erhöhe ich die auf 25MB, denn kommt Error-Code 1, UPLOAD_ERR_INI_SIZE, das ja bei 8 MB liegt. Genau so soll das sein. Hatte es eben mit so großen Dateien noch nie getestet.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • So, auch dafür hat das PHP-Man einen Vorschlag, recht einfach und geht auch

    Das normale Formular, Request erfolgt per GET
    /index.php?mod=bildergalerie&do=upload

    Das Formular postet an
    /index.php?mod=bildergalerie&do=upload&process=1

    Ist nun das Post-Limit überschritten, dann landet man zwar auch bei
    /index.php?mod=bildergalerie&do=upload&process=1

    $_POST ist aber leer.

    Also eine einfache Prüfung. Wenn process=1 vorhanden und $_POST leer, dann wurde das Formular zwar gesendet, aber das Post-Limit überschritten.

    :)

    Schneller Würgaround, den extra GET-Parameter braucht man eigentlich nicht.

    Code
    if($_SERVER['REQUEST_METHOD'] == 'POST' AND empty($_POST) AND empty($_FILE) AND (isset($_SERVER['CONTENT_LENGTH']) AND $_SERVER['CONTENT_LENGTH'] > 0))
    {
        echo 'Fehler, Post-Limit überschritten';
    }

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(