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)| Parametro | Descrizione |
|---|---|
$zip_entry | L'handle dell'entry restituito da zip_entry_open() dopo che l'archivio è stato aperto con zip_open() e un'entry ottenuta da zip_read(). |
$length | Opzionale. 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
.zipsenza estrarli su disco. - Ispezione di un upload (ad esempio, un
.docxo.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.