Domanda

Sto scrivendo uno script PHP che genera un file compresso con gzip.L'approccio che ho usato è quello di costruire una stringa in PHP e gzcompress() la stringa prima di scrivere su un file alla fine dello script.

Ora sto testando il mio script con file di grandi dimensioni e in esecuzione in errori di allocazione di memoria.Sembra che la stringa di risultati, sta diventando troppo grande da tenere in memoria in una sola volta.

Per risolvere questo ho cercato di usare gzopen() e gzwrite() per evitare di allocare una stringa in PHP.Tuttavia, il formato gzip file generato con gzwrite() è molto diverso da quando lo uso gzcompress().Ho provato con varie zip livelli, ma non aiuta.Ho anche provato a usare gzdeflate() e finisce con lo stesso risultato gzwrite(), ma non ancora del tutto simile a gzcompress().Non sono solo i primi due byte (zlib intestazione) che sono diverse, è l'intero file.

Cosa gzcompress() fare in modo diverso dagli altri gzip funzioni in PHP?C'è un modo per emulare i risultati di gzcompress() mentre incrementale di produrre il risultato?

È stato utile?

Soluzione

Sono certo non al 100%, ma la mia ipotesi è che gzcompress utilizza il formato GZIP, e gzopen / gzwrite uso zlib. Onestamente, non posso dirvi quale sia la differenza tra i due è, ma so che GZIP utilizza zlib per la compressione vera e propria.

E 'possibile che niente di tutto questo importa però. Prova a creare un file gzip con gzopen / gzwrite e poi decomprimerlo utilizzando il programma gzip da riga di comando. Se funziona, quindi utilizzando gzopen / gzwrite lavorerà per voi.

Altri suggerimenti

La differenza principale è che il gzwrite funzione avvia zlib con il SYNC_FLUSH opzione, che verrà riquadro l'output di un 4 limite di byte (o 2), e quindi un po ' di più (0x00 0x00 0xff 0xff 0x03).

Se si utilizzano questi per creare file Zip, attenzione che il valore di default di Mac programma di utilità dell'Archivio NON accetta questo formato.

Da quello che posso dire, SYNC_FLUSH è una gzip opzione, e non è ammesso nel PKZip/Info-formato ZIP, tutti .i file zip e loro derivati di provenienza.

Se si sgonfia un piccolo file di testo, risultante in un unico deflazionare il blocco, e confrontarlo con lo stesso testo scritto con gzwrite, vedrai 2 differenze, uno dei byte dell'intestazione di deflazionare il blocco è diverso da 1, e la fine è imbottito con sopra byte.Se il risultato è maggiore di uno deflazionare il blocco, le differenze iniziare ad accumularsi.È difficile risolvere questo problema, come deflazionare il flusso di bloccare le intestazioni non sono nemmeno byte allineati.C'è una ragione per tutti gli usi zlib.Poche persone hanno il coraggio anche di tentare di riscrivere il formato!

Mi sono imbattuto in un problema simile una volta - in fondo non c'era abbastanza RAM allocata per php per fare il business.

Ho finito per salvare la stringa come file di testo, quindi utilizzando exec () a gzip il file utilizzando il file system. La sua non è una soluzione ideale, ma ha funzionato per la mia situazione.

provare ad aumentare il parametro memory_limit nel file php.ini

Sia gzcompress () e gzopen () utilizzare il metodo di compressione DEFLATE blocchi. Ma hanno diversa intestazione / rimorchio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top