Come appare il messaggio
The uploaded file exceeds the upload_max_filesize directive in php.ini
PHP Warning: POST Content-Length of 52428900 bytes exceeds the limit of 8388608 bytes in Unknown on line 0Cause frequenti
upload_max_filesizenelphp.inidi PHP-FPM è più piccolo del file.post_max_sizeè più piccolo dell'upload più gli altri dati del form (allora$_FILESresta vuoto senza avvisi).client_max_body_sizedi nginx è più piccolo e risponde 413 prima che PHP veda il file.- L'impostazione è stata cambiata nel
php.inidella CLI invece di quello FPM. - Un pool o un
.user.inisovrascrive il valore globale, oppure l'upload è così lento chemax_input_timeomax_execution_timelo interrompe.
Verifica
- Valori effettivi nel php.ini di FPM
grep -E '^(upload_max_filesize|post_max_size|memory_limit|max_input_time|max_execution_time) *=' /etc/php/*/fpm/php.ini - Override in conf.d e nei pool
grep -rEn 'upload_max_filesize|post_max_size' /etc/php/*/fpm/conf.d/ /etc/php/*/fpm/pool.d/ - Il limite di nginx
nginx -T 2>/dev/null | grep -n 'client_max_body_size' - Cosa risponde il web server a un body grande? (guarda la riga di stato)
curl -s -o /dev/null -w '%{http_code}\n' -X POST --data-binary @/etc/services https://example.com/upload.php
Soluzione
- Crea un drop-in
/etc/php/<versione>/fpm/conf.d/99-upload.iniconupload_max_filesize = 64Mepost_max_size = 72M. Il secondo valore deve essere maggiore del primo. - Assicurati che
memory_limitnon sia più piccolo dipost_max_sizese l'applicazione carica il file in memoria. - In nginx imposta
client_max_body_size 72M;(inhttp,servero nellalocationdell'upload). - Riavvia il servizio PHP-FPM della tua versione e ricarica nginx:
nginx -t && systemctl reload nginx. - Con connessioni lente alza anche
max_input_timeemax_execution_time.
Domande frequenti
Perché post_max_size deve essere maggiore di upload_max_filesize?
La richiesta POST contiene il file più i campi del form e l'overhead di codifica. Se supera post_max_size, PHP scarta l'intero body della richiesta.
Con nginx serve .htaccess?
No. nginx ignora .htaccess. Usa il drop-in del php.ini oppure php_admin_value nel file del pool.