W3docs

zip_entry_read()

La funzione zip_entry_read() è una funzione built-in di PHP usata per leggere il contenuto di un file in un archivio zip.

La funzione zip_entry_read() era una funzione built-in di PHP utilizzata per leggere il contenuto di un singolo file (una entry) all'interno di un archivio zip aperto, un blocco di byte alla volta. Restituiva i dati letti come string.

Importante: L'intera famiglia procedurale zip_entry_* — inclusa zip_entry_read() — è stata deprecata in PHP 7.4 e rimossa in PHP 8.0. Non esiste un sostituto diretto; al contrario, il PHP moderno legge le entry degli archivi zip tramite la classe orientata agli oggetti ZipArchive. Questa pagina documenta la funzione legacy come riferimento e mostra poi l'approccio con ZipArchive da utilizzare oggi. Per lavorare con i file zip, l'estensione zip deve essere abilitata nella build di PHP.

Sintassi (Legacy)

string zip_entry_read(resource $zip_entry, int $length = 1024)
ParametroDescrizione
$zip_entryL'handle dell'entry restituito da zip_entry_open() dopo che l'archivio è stato aperto con zip_open() e un'entry ottenuta da zip_read().
$lengthOpzionale. Il numero di byte da leggere. Poiché le entry zip sono memorizzate in modo compresso, questo è il numero di byte non compressi restituiti. Il valore predefinito è 1024.

Valore restituito: il contenuto letto come string, oppure false in caso di errore. Come la lettura da un file, le chiamate ripetute avanzano attraverso l'entry finché non è esaurita.

Lettura di una entry zip con ZipArchive (moderno)

Il sostituto più semplice è ZipArchive::getFromName(), che restituisce l'intero contenuto decompresso di una entry tramite il suo nome file — senza ciclo manuale di apertura/lettura/chiusura per ogni entry.

Lettura di un file da un archivio zip in PHP

$zip = new ZipArchive();

if ($zip->open('example.zip') === true) {
    $contents = $zip->getFromName('readme.txt');
    $zip->close();

    if ($contents !== false) {
        echo $contents;
    } else {
        echo "Entry not found in archive.";
    }
} else {
    echo "Failed to open archive.";
}

Qui open() restituisce true in caso di successo (può anche restituire un codice di errore, quindi confronta rigorosamente con === true). getFromName() decomprime e restituisce l'intera entry in una sola chiamata. Usa getFromIndex($i) quando vuoi la entry in una posizione numerica anziché per nome.

Iterazione su tutte le entry

Un compito reale comune è leggere tutti i file in un archivio. numFiles fornisce il conteggio delle entry e statIndex() fornisce i metadati di ciascuna entry:

$zip = new ZipArchive();

if ($zip->open('example.zip') === true) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $name = $zip->getNameIndex($i);
        $data = $zip->getFromIndex($i);
        echo $name . " (" . strlen($data) . " bytes)\n";
    }
    $zip->close();
}

Streaming di entry di grandi dimensioni

getFromName() carica l'intera entry in memoria. Per un file di grandi dimensioni, apri la entry come stream e leggila a blocchi — questo è il vero equivalente moderno del comportamento a blocchi di zip_entry_read():

$zip = new ZipArchive();

if ($zip->open('example.zip') === true) {
    $stream = $zip->getStream('big-log.txt');
    if ($stream) {
        while (!feof($stream)) {
            $chunk = fread($stream, 8192); // read 8 KB at a time
            echo $chunk;
        }
        fclose($stream);
    }
    $zip->close();
}

Lo stream restituito è una normale risorsa stream PHP, quindi funzioni familiari come fread() e feof() funzionano direttamente su di esso.

Quando usarla?

  • Lettura di file di configurazione o template inclusi in un .zip senza estrarli su disco.
  • Ispezione di un upload (ad esempio, un .docx o .xlsx, che sono contenitori zip) entry per entry.
  • Elaborazione di log archiviati di grandi dimensioni tramite streaming anziché decomprimere tutto prima.

Se hai bisogno solo dei byte di un singolo file e non ti importa che si trovi in un zip, estrarlo prima e usare file_get_contents() è anch'essa un'opzione valida.

Conclusione

zip_entry_read() apparteneva all'API zip procedurale legacy di PHP, deprecata nella versione 7.4 e rimossa nella versione 8.0. Su qualsiasi versione PHP supportata, leggi le entry zip con la classe ZipArchive: usa getFromName() / getFromIndex() per entry intere, itera con numFiles e usa getStream() con fread() quando una entry è troppo grande per essere tenuta in memoria tutta in una volta.

Pratica

Pratica
In PHP 8.0+, qual è il modo corretto per leggere il contenuto di un singolo file da un ZipArchive aperto?
In PHP 8.0+, qual è il modo corretto per leggere il contenuto di un singolo file da un ZipArchive aperto?
Was this page helpful?