2011-01-06 2 views
8

Sto provando a caricare un file più grande di 2 GB su un server PHP 5.3.4 locale. Ho impostato le seguenti variabili server:Caricamento di un file più grande di 2 GB con PHP

memory_limit = -1 
post_max_size = 9G 
upload_max_filesize = 5G 

Tuttavia, nel error_log ho trovato:

PHP Warning: POST Content-Length di 2120909412 byte supera il limite di 1073741824 byte in Unknown on line 0

Qualcuno può dirmi perché questo continua a non riuscire per favore?

+3

HTTP non è davvero la scelta giusta del protocollo per il caricamento di un file da 2 GB. Dovresti usare (S) FTP per questo. –

+3

Hai verificato che quelle sono le variabili in uso? (per esempio, tramite 'phpinfo()') PHP non smette mai di sorprendermi su quale file di configurazione in realtà sta leggendo ... (Inoltre, HTTP non è pensato per questo ...) – Thanatos

+1

Perché vuoi usare PHP per questo invece di qualcosa come FTP o un numero qualsiasi o altri modi di caricare file – Earlz

risposta

2

Forse questo può venire da limitazioni Apache su misura del perno:

http://httpd.apache.org/docs/current/mod/core.html#limitrequestbody

Sembra questa limitazione su 2 Gb può essere superiore a 64bits installazioni, forse. E non sono sicuro che l'impostazione 0 in questo directove non raggiunga il limite di compilazione. vedere di esempi che discussione:

http://ubuntuforums.org/archive/index.php/t-1385890.html

Quindi non dimenticare di modificare anche la max_input_time in PHP.

Ma si stanno raggiungendo limiti elevati :-) forse si potrebbe provare un client ricco (flash? Js?) Dal lato del browser, facendo il trasferimento in blocchi o una sorta di cose FTP, con indicatori di progresso per l'utente.

+0

Ho provato la stessa operazione su un sistema operativo a 64 bit e non ho avuto problemi di sorta. Grazie per l'aiuto. – Reado

3

Non so in 5.3.x, ma in 5.2.x ci sono alcuni problemi int/long nel codice PHP. anche se sei su un sistema a 64 bit e hai una versione di PHP compilata a 64 bit, ci sono diversi problemi.

In primo luogo, il codice che converte post_max_size e altri da ascii in intero memorizza il valore in un int, quindi convertendo "9G" e inserendo il risultato in questo int sarà il valore di bork perché 9G è un numero maggiore di un 32 -bit variabile può contenere.

Ma ci sono anche molte altre aree del codice PHP che sono usate con il modulo Apache, CGI, ecc. Che devono essere cambiate da int a long.

Quindi ... per farlo funzionare, è necessario modificare il codice PHP e compilarlo a mano (assicurarsi di compilarlo come 64-bit). ecco un link a un elenco di diff:

http://www.archive.org/~tracey/downloads/patches/karmic-64bit-post-large-files.patch

di riferimento da questo post php bug: http://bugs.php.net/bug.php?id=44522

Il file di cui sopra è un diff su 5.2.10 del codice, ma ho appena fatto le modifiche a mano al codice 5.2.17 e ho appena caricato un singolo file 3.4gb tramite apache/php (che non aveva funzionato prima della modifica).

ope che aiuta.

3

Ho avuto un problema simile, ma il mio config è stato:

post_max_size = 1.8G 
upload_max_filesize = 1.8G 

e tuttavia non ho potuto caricare un file 1.2GB.L'errore è stato molto stessa:

PHP Warning: POST Content-Length of 1347484420 bytes exceeds the limit of 1073741824 bytes in Unknown on line 0 

ho passato una giornata a chiedersi dove diavolo fosse questo "limite di 1073741824" provenienti da!

Soluzione:

In realtà, l'errore è stato nel parser php.ini: E 'solo capisce numeri interi, così essenzialmente si analizzava 1.8G come 1G !!

Modifica del valore ad es. 1800M risolto.

Pls assicurano di riavviare il server apache con il seguito di comando servizio apache2 restart

+0

Ho cercato ore per scoprire quale potrebbe essere il problema con un'installazione di owncloud per il caricamento di file di grandi dimensioni, e questo era il problema dopo tutto. – Ark74

1

Come accennato phliKtid, questa è una limitazione con il framework PHP. Salva per modificare il codice sorgente come menzionato nel phliKtid collegato bug report, c'è una soluzione che comporta l'impostazione di upload_max_filesize a 0 nel file php.ini.

; Maximum allowed size for uploaded files. 
; http://php.net/upload-max-filesize 
upload_max_filesize = 0 

In questo modo, il PHP non vada in crash quando si tenta di convertire "5G" in un numero intero a 32 bit e si sarà in grado di caricare file grandi come si permette con la variabile "post_max_size".

1

io a capire come utilizzare http e php per caricare un 10G file.

php.ini:

post_max_size = 0 
upload_max_filesize = 0 

Funziona in php 5.3.10.

se non si carica tutto il file in memoria, memory_limit non è correlato.