W3docs

zip_entry_compressionmethod()

La funzione zip_entry_compressionmethod() in PHP restituisce il metodo di compressione di un file in un archivio zip.

Avviso: zip_entry_compressionmethod() è stata deprecata in PHP 5.3.0 e rimossa in PHP 8.0.0 (la vecchia API procedurale zip_* è stata eliminata). Non è più disponibile nelle versioni moderne di PHP. Questa pagina è mantenuta a scopo di riferimento storico. In qualsiasi versione supportata di PHP, utilizza invece la classe ZipArchive, come mostrato di seguito.

La funzione zip_entry_compressionmethod() era una funzione integrata di PHP utilizzata per leggere il metodo di compressione di una singola voce (file) all'interno di un archivio zip. Il metodo di compressione è l'algoritmo utilizzato per memorizzare quella voce — solitamente deflate (il predefinito) o store (nessuna compressione).

Questa pagina spiega cosa faceva la funzione legacy e, soprattutto, come ottenere le stesse informazioni in PHP moderno con ZipArchive.

Perché il metodo di compressione è importante

Ogni file in un archivio zip registra come è stato compresso. Conoscere il metodo consente di:

  • Controllare un archivio — verificare se i file sono effettivamente compressi o semplicemente memorizzati.
  • Stimare il lavoro — le voci store si decomprimono istantaneamente; le voci deflate richiedono CPU.
  • Diagnosticare problemi di dimensione — i dati già compressi (JPEG, PNG, MP4) vengono spesso memorizzati anziché ricompressi, perché ri-comprimerli con deflate non porta alcun vantaggio.

I due metodi che si incontrano in pratica sono:

CostanteCodiceSignificato
ZipArchive::CM_STORE0La voce è memorizzata senza compressione.
ZipArchive::CM_DEFLATE8La voce è compressa con l'algoritmo deflate (il predefinito).

Sintassi legacy

La funzione originale accettava un handle di voce zip restituito da zip_read():

int zip_entry_compressionmethod(resource $zip_entry)

Dove $zip_entry è la risorsa di voce zip per un file nell'archivio. Ciò richiedeva la vecchia API zip procedurale e non esiste più, quindi non utilizzarla nel nuovo codice.

Approccio moderno con ZipArchive

Il modo portabile e sicuro per leggere il metodo di compressione è ZipArchive::statIndex(). Restituisce un array la cui chiave comp_method contiene il codice numerico del metodo (0 per store, 8 per deflate). Il seguente esempio è completamente autonomo — crea un piccolo archivio e poi riporta il metodo di ogni voce:

<?php
$file = sys_get_temp_dir() . '/example.zip';

// 1. Build a zip with one compressed and one stored entry.
$zip = new ZipArchive();
if ($zip->open($file, ZipArchive::CREATE | ZipArchive::OVERWRITE) === true) {
    $zip->addFromString('report.txt', str_repeat('compress me ', 100));
    $zip->addFromString('raw.txt', 'left as-is');
    $zip->setCompressionName('raw.txt', ZipArchive::CM_STORE); // force no compression
    $zip->close();
}

// 2. Reopen and read each entry's compression method.
$labels = [
    ZipArchive::CM_STORE   => 'stored (no compression)',
    ZipArchive::CM_DEFLATE => 'deflate',
];

$zip = new ZipArchive();
if ($zip->open($file) === true) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $stat   = $zip->statIndex($i);
        $code   = $stat['comp_method'];
        $method = $labels[$code] ?? "unknown ($code)";
        echo "{$stat['name']} => {$method}\n";
    }
    $zip->close();
}

Output:

report.txt => deflate
raw.txt => stored (no compression)

statIndex() legge dalla directory centrale, quindi è economico — non decomprime mai il file.

Alternativa più breve: getCompressionName()

Se il tuo PHP è compilato con libzip 1.0 o versioni più recenti, ZipArchive::getCompressionName() restituisce il nome del metodo direttamente come stringa:

$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
    // Name of the compression method used for the first entry.
    echo $zip->getCompressionName(0); // e.g. "deflate"
    $zip->close();
}

È più leggibile, ma getCompressionName() non è presente in ogni build. Preferisci l'approccio con statIndex() sopra quando hai bisogno di portabilità tra server diversi.

Conclusione

zip_entry_compressionmethod() apparteneva alla vecchia API zip procedurale di PHP, che è stata rimossa, e non dovrebbe mai essere usata nel nuovo codice. Per leggere il metodo di compressione di una voce zip in PHP moderno, utilizza ZipArchive::statIndex() e ispeziona il valore comp_method (0 = store, 8 = deflate), oppure getCompressionName() dove disponibile.

Per continuare a lavorare con gli archivi zip, vedi Lavorare con l'estensione Zip, zip_entry_name() per il nome di una voce e zip_entry_compressedsize() per la sua dimensione compressa.

Pratica

Pratica
Cosa fa la funzione zip_entry_compressionmethod() in PHP?
Cosa fa la funzione zip_entry_compressionmethod() in PHP?
Was this page helpful?