2009-02-23 10 views
30

Ciao sono abbastanza nuovo in PHP, ho creato un modulo per file csv molto grandi da caricare sul mio server. Qualcuno mi ha detto che il browser può scadere perché il file di caricamento è troppo grande, è vero? e se sì, può essere prevenuto?Il caricamento dei file può scadere in PHP?

Grazie per il vostro aiuto!

risposta

50

Hai bisogno di un valore corretto per le seguenti impostazioni di php.ini: (! Non max_execution_time)

  1. max_input_time
  2. upload_max_filesize
  3. post_max_size

e forse

  1. memory_limit
+6

La documentazione PHP per max_input_time dice: "Viene misurata dal momento della ricezione di tutti i dati sul server all'inizio dell'esecuzione dello script." Quindi, perché le dimensioni del file farebbero la differenza? Tutti i dati sono stati ricevuti prima dell'avvio di questo timer. – Oscar

+0

Dopo il test, confermo che 'max_input_time' sembra non avere alcun effetto su questo problema. –

1

Sì, è vero. Il caricamento dei file avviene tramite una richiesta POST e le richieste in generale sono soggette a timeout. Dovresti essere in grado di riconfigurare il tuo ambiente per un timeout della richiesta più lungo.

2

Uno script può essere eseguito, per impostazione predefinita, per qualcosa come 30 secondi. È possibile utilizzare set_time_limit() function per modificare questo. Inoltre, se il tuo utente dovrà caricare file di grandi dimensioni, dovrai modificare i valori post_max_size e/o upload_max_filesize nel tuo file php.ini.

Inoltre, se si desidera solo estendere il limite di timeout a livello globale, è possibile modificare il tempo di esecuzione massimo in php.ini.

+0

geniale, grazie per quello! non sapevo nemmeno di post_max_size o upload_max_file_size! molto apprezzato –

+1

set_time_limit influenza la stessa impostazione di max_execution_time in php.ini. Il documento dice "Il tempo massimo di esecuzione non è influenzato dalle chiamate di sistema, dalle operazioni di streaming ecc." Il caricamento del file conta come una "operazione streaming"? In tal caso, sembra che questa impostazione non sia di aiuto. – Oscar

1

Non è solo timeout che possono causare problemi. Ci sono alcuni limiti sulla dimensione massima del file che può essere caricato. Questi limiti possono essere modificati nel file php.ini:

post_max_size
upload_max_filesize memory_limit

Partenza http://uk.php.net/ini.core per i dettagli.

27

Ci sono alcune direttive di configurazione che possono causare grandi arrivi a fallire se i loro valori sono troppo piccoli:

PHP

  • max_input_time tempo massimo in secondi uno script è permesso di analizzare i dati di input, come POST, GET e file caricati
  • upload_max_filesize Dimensione massima di un file caricato.
  • post_max_size Dimensione massima dei dati postali consentiti.

Apache

  • TimeOut quantità di tempo che il server attende determinati eventi prima di guastarsi una richiesta
  • LimitRequestBody limita la dimensione totale del corpo della richiesta HTTP inviata dal client

Ci sono probabilmente più di Questo.

+0

Non ho idea di dove andare per modificare le impostazioni di apache :( –

+0

Chiedete al vostro provider se queste impostazioni sono corrette per caricare file di grandi dimensioni – Gumbo

3

Quando il caricamento di file di grandi dimensioni, è necessario cambiare 4 variabili di configurazione:

  • upload_max_filesize
  • post_max_size
  • memory_limit
  • time_limit

tempo limite può essere aumentato in fase di esecuzione con set_time_limit().

+0

Per quanto ne so non esiste una direttiva in PHP - time_limit. Set_time_limit() imposta max_execution_time. – jayarjo

4

Un buon modo per aggirare la scarsa gestione dei grandi file caricati in php, è utilizzare un uploader come JUpload che dividerà il file in blocchi prima di inviarli. Ciò ha anche il vantaggio per gli utenti di ottenere un feedback di avanzamento corretto durante il caricamento e di caricare più file in una volta sola.

1

La mia risposta non è direttamente correlata alla domanda originale, ma se si dispone di un servizio di bilanciamento del carico del proxy inverso davanti allo script PHP, il servizio di bilanciamento del carico può sospendere o bloccare grandi caricamenti. Controllare sempre la configurazione del servizio di bilanciamento del carico se si supportano i caricamenti di file. Proprio come PHP, la maggior parte delle impostazioni di bilanciamento del carico predefinite per i caricamenti sono piuttosto piccole.

1

sono stato in grado di risolvere questo problema utilizzando le seguenti impostazioni, è possibile utilizzare valori diversi, ma si ottiene l'idea:

per il mio assistente, ho messo queste linee in un file ".user.ini" all'interno dello script directory, il server potrebbe cercare un file diverso, se si fa un phpinfo ('user_ini.filename') sul server sarà sputare fuori il file è necessario mettere i valori in

max_execution_time = 1800 
max_input_time = -1 
post_max_size = 100M 
upload_max_filesize = 100M 
memory_limit = 256M 
0

Se la modifica di qualsiasi i parametri di cui sopra non sembrano fare alcuna differenza, può essere che un modulo html da qualche parte contiene il nome MAX_FILE_SIZE come campo nascosto.

<input type="hidden" name="MAX_FILE_SIZE" value="10000000">

Nell'esempio di cui sopra, non saranno caricati tutti i file superiori a 10 MB.

Problemi correlati