Domanda

Sto cercando di generare un archivio sul volo in PHP e inviarlo immediatamente all'utente (senza salvarlo). Ho pensato che non sarebbe necessario creare un file su disco poiché i dati che sto inviando non sono comunque persistenti, tuttavia, dopo aver cercato sul Web, non sono riuscito a scoprire come. Inoltre non mi interessa il formato del file.

Quindi, la domanda è:

È possibile creare e manipolare un archivio di file in memoria all'interno di uno script PHP senza creare un file temp lungo la strada?

È stato utile?

Soluzione

Ho avuto lo stesso problema ma alla fine ho trovato una soluzione un po 'oscura e ho deciso di condividerla qui.

Sono arrivato in modo grande il grande zip.lib.php/unzip.lib.php Script che arrivano phpmyadmin e si trovano nella directory delle "biblioteche".

Usando zip.lib.php ha funzionato come un fascino per me:

require_once(LIBS_DIR . 'zip.lib.php');

... 

//create the zip
$zip = new zipfile();

//add files to the zip, passing file contents, not actual files
$zip->addFile($file_content, $file_name);

...

//prepare the proper content type
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=my_archive.zip");
header("Content-Description: Files of an applicant");

//get the zip content and send it back to the browser
echo $zip->file();

Questo script consente il download di una zip, senza la necessità di avere i file come file reali o salvare la zip stessa come file.

È un peccato che questa funzionalità non faccia parte di una libreria PHP più generica.

Ecco un link al zip.lib.php File dalla fonte PhpMyAdmin:https://github.com/phpmyadmin/phpmyadmin/blob/release_4_5_5_1/libraries/zip.lib.php

AGGIORNARE:Assicurati di rimuovere il seguente controllo dall'inizio di zip.lib.php come altrimenti lo script termina:

if (! defined('PHPMYADMIN')) {
    exit;
}

AGGIORNARE:Questo codice è disponibile anche sul progetto CodeIgniter:https://github.com/patricksavalle/codeigniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php

Altri suggerimenti

Cosa stai usando per generare l'archivio? Potresti essere in grado di utilizzare il flusso PHP: // TEMP o PHP: // Memoria da leggere e scrivere da/dall'archivio.

Vedere http://php.net/manual/en/wrappers.php.php

Per quanto riguarda il tuo commento che php: // temp funziona per te tranne quando lo chiudi, prova a tenerlo aperto, a scaricare l'output, quindi riavvolgilo a 0 e leggilo.

Cerca qui altri esempi: http://us.php.net/manual/en/function.tmpfile.php

Ricerca anche il buffering e l'acquisizione: http://us.php.net/manual/en/function.ob-sTart.php

Devi usare ZipArchive::addFromString - Se usi addFile() Il file non viene effettivamente aggiunto fino a quando non si accede. (Orribile bug imho, cosa succede se stai cercando di spostare i file in una zip e li elimina prima di chiudere la zip ...)
Il addFromString() Il metodo lo aggiunge immediatamente all'archivio.

C'è davvero un problema di performance qui o offende il tuo senso di giustezza? Molti processi scrivono file temporanei ed eliminali, e spesso non hanno mai colpito il disco a causa della memorizzazione nella cache.

Un file temp viene eliminato automaticamente quando chiuso. Questa è la natura.

Ci sono solo due modi in cui riesco a pensare per creare un file zip in memoria e servirlo ed entrambi sono probabilmente più problemi di quanto valgano.

  • Usa un disco RAM.
  • Modifica la classe ziparchive per aggiungere un metodo che fa tutto il metodo Close (), tranne chiudi effettivamente il file. (O aggiungere un parametro di congedo per chiudere ()).
    Ciò potrebbe non essere nemmeno possibile a seconda delle librerie C sottostanti.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top