2013-04-20 19 views
9

Ho cartelle che hanno immagini generate dall'utente che diventano piuttosto grandi. Quando provo a comprimere questi file ottengo errori in file zip da 1,5 gig.archivio php zip memoria, ram e dimensione massima del file

Le mie domande hanno a che fare con la memoria e penso che php stia tenendo sia la zip aperta che tutte le immagini in memoria. Una possibile soluzione che ho è di inviare ogni immagine sul caricamento nel file zip in aggiunta alla cartella appropriata, questo sembra funzionare finora ma quali sono i limiti della dimensione del file zip, da quello che posso trovare circa 4 GB. In che modo questo influisce/interagisce con la quantità di ram sul server? \ Ed è il limite in realtà di 4 GB o posso continuare ad aggiungere i file allo zip indefinitamente o dovrei avere lo script per controllare la dimensione dello zip e se è finito X i concerti lo rinominano e creano un nuovo zip. Ho cercato su google e ho letto la documentazione, ma ho trovato informazioni contrastanti o informazioni incomplete, quindi sto cercando alcune risposte e consigli definitivi. Grazie

+0

la quantità di memoria che gli script php hanno con la configurazione (vedere php.ini ==> phpinfo() – Dukeatcoding

+1

è meglio eseguire un 'zip' esterno tramite' exec() '. NON si desidera un php processare le multi-gigs di ram. –

+0

@Duke 32m fuori dalla scatola ma l'ho impostato su 128m –

risposta

2

utilizzare PHP exec e chiamare uno strumento zip sulla riga di comando

exec("tar -zcvf archive.tar.gz /folder/tozip"); 

Assicurarsi che l'utente che sta eseguendo il file php ha accesso alla cartella che si desidera comprimere

E prendere cura del codice di iniezione.

+0

ci sarà un limite al numero di file o alla dimensione del file finale che posso comprimere usando exec? –

+0

normalmente no, a patto che il filesystem possa gestire il file in uscita – Dukeatcoding

9

Nel caso in cui si desidera continuare a utilizzare il PHP ZipArchive, ci sono alcune cose che puoi fare per prevenire alcune limitazioni del server/OS:

  • memoria Anche se può sembrare ovvio nel tuo caso, Ho visto molti esempi su come utilizzare ZipArchive che utilizza addFromString per aggiungere un nuovo file all'archivio. NON FARE! Questo alloca la memoria per aprire il file e memorizzarne il contenuto, che ti farà esaurire la memoria velocemente, usa invece addFile. Assicurati anche di liberare tutta la memoria che non ti serve.

  • tempo di esecuzione Aumentare il tempo massimo di esecuzione per lo script, sia tramite php.ini, oppure con ini_set (ad es ini_set('max_execution_time', 600); per avere un tempo massimo di esecuzione di 10 minuti)

  • handle di file Alcuni Il sistema operativo ha dei limiti sul numero di file aperti che possono causare un problema perché PHP aggiunge i file allo zip una volta chiuso il file zip. Per evitare problemi con il numero di file aperti basta chiudere e riaprire il file zip ogni x file (ad esempio ogni 1000), questo costringerà PHP a comprimere e aggiungere i file già assegnati all'archivio.

  • Dimensioni della cartella Ci possono essere alcune limitazioni di dimensione del file del sistema operativo, un file più grande significa anche che PHP ha bisogno di più memoria per gestirlo, in modo che io personalmente preferisco utilizzare una dimensione massima del file dopo il quale ho appena aperto un nuovo file zip utilizzando un numero di indice. Se le dimensioni esatte del file non ti interessano, puoi semplicemente contare la dimensione dei file che entrano nell'archivio e poi passare dopo aver raggiunto un certo limite, oppure puoi chiudere l'archivio ogni x file e controllarne le dimensioni su disco per decide wether per iniziare un nuovo archivio o meno (ricordate, i file vengono compressi solo una volta che si vicino l'archivio)

mi piace personalmente a limitare la dimensione del file da ottenere la dimensione dei file che va in archivio e applicando un probabile fattore di compressione per vedere quando verrà raggiunta la dimensione massima dell'archivio (file jpg ~ 0.9, file zip = 1, file di testo ~ 0.10, ...) e quindi passare al volume successivo.

+1

Hai appena salvato una vita !!! – Omolara

+0

Sarebbe 'addGlob()' un'opzione migliore per aggiungere tutti i file da una cartella? – Mirko