Basilarmente, il file caricato diventa visibile al codice PHP attraverso l’array superglobale $_FILE[]. I dati del file vengono messi qui dopo avere viaggiato dal browser al server WEB, e dal server WEB al PHP. Lato server ci sono parecchi parametri di configurazione rilevanti che riguardano il WEB server e PHP. Cominciamo dal WEB server. Qui considero Apache:

    LimitRequestBody 1000000

Per default Apache non pone limite alla lunghezza del POST, a meno che non sia stata usata questa direttiva di configurazione. Se il POST dal client supera questo limite, il server risponde al client con un errore HTTP 413 “Request Entity Too Large”, nel log degli errori di Apache compare la scritta “Request content-length of 85592334 is larger than the configured limit of 1000000″ e il nostro programma PHP non viene eseguito.

Veniamo ora al PHP vero e proprio. Il suo file di configurazione php.ini contiene molti parametri interessanti:

    file_uploads = On

Questo flag abilita la ricezione dei file. Se non abilitato, i file inviati in upload vengono semplicemente ignorati e l’array $_FILES[] non viene creato.

 
   upload_tmp_dir = /tmp

La directory nella quale vengono salvati i file durante l’upload. Controllare che ci sia abbastanza spazio. Se la directory non esiste o l’interprete non ha permessi di scrittura in essa, riceveremo l’errore UPLOAD_ERR_NO_TMP_DIR. Se lo spazio nella partizione che contiene i file temporanei si esaurisce, la scrittura fallisce e il nostro programma riceve UPLOAD_ERR_CANT_WRITE.

    upload_max_filesize = 1M

Dimensione massima di ciascun file caricato via POST HTTP (in questo esempio 1 MB). Se il FORM prevede la possibilità di caricare due o più file, ciascun file deve rispettare questo limite. Per i file che superano questo limite:

  • viene generato il messaggio di errore PHP Notice: file too big (0 B) — check upload_max_filesize in php.ini
  • viene ritornato il codice di errore UPLOAD_ERR_INI_SIZE nell’elemento $_FILES[*]['error'] relativo a quel file.
  • nessun file temporaneo viene ritornato (quindi del file caricato non rimane traccia).

PHP non supporta file più lunghi di 2 GB, e pertanto questo è anche il limite massimo di questo parametro.

    post_max_size = 1M

Dimensione massima del POST (in questo esempio 1 MB). Questo include tutti i dati di header e boundary del protocollo HTTP; si tratta di qualche centinaio di caratteri in più oltre ai dati dei campi di input, dei campi hidden e dei file inviati. Se i dati del POST superano questo limite, allora:

  • viene generato l’errore PHP Warning: POST Content-Length of 8168763 bytes exceeds the limit of 1048576 bytes in Unknown on line 0
  • gli array superglobali $_POST[] e $_FILES[] ritornano array() vuoti; l’array dei $_COOKIES[], almeno quello, ritorna il dovuto.
  • il nostro programma PHP viene eseguito regolarmente, ma non troverà alcun dato e quindi potrà fare ben poco.

Purtroppo non c’è un modo certo di riconoscere il problema a livello del programma, salvo che conteggiando count($_POST): se risulta zero è probabile che il POST sia fallito a causa del superamento del limite imposto da post_max_size, dato che $_POST[] dovrebbe contenere almeno il bottone che ha prodotto il submit del FORM. E’ evidente che dovremo impostare post_max_size > n*upload_max_filesize dove n è il numero di file che si possono inviare contemporaneamente dal FORM.

 
    memory_limit = 8M

Quantità massima di memoria che lo script può consumare (in questo esempio 8M). Oltre questo limite il programma viene interrotto con segnalazione di un errore fatale. Questa memoria comprende i campi del POST ma sono esclusi i file. In generale i campi del FORM contengono ben pochi dati che l’utente ha compilato a mano, per cui in pratica questa è solo la memoria di lavoro dell’interprete. Spesso questa memoria viene divorata dalle interrogazioni al data base quando si pretende di salvare in un array migliaia di risultati di un SELECT SQL. In definitiva questo limite non riguarda l’upload dei file a meno che non si usino i campi BLOB (di cui parleremo più avanti). Attenzione: per PHP < 5.2 il controllo memory limit è disabilitato per default, e occorre l’opzione di compilazione –enable-memory-limit.

    max_input_time = 10

Il manuale spiega che questo è il tempo massimo per l’elaborazione dei dati del GET/POST. Non ho capito bene cosa ciò dovrebbe significare e quali implicazioni abbia nel nostro discorso. Se presente, non modificare.

    max_execution_time = 30

Tempo massimo di esecuzione del nostro programma PHP, in secondi. Non ha niente a che vedere con l’upload dei file perché il nostro programma PHP viene avviato solo *dopo* che tutti i dati del POST HTTP sono arrivati al server.

http://www.radinks.com/upload/config.php