CLXXIX. Fonctions ZIP

Introduction

Ce module vous permet de lire et d'écrire des archives compressées ZIP ainsi que les fichiers contenus dans ces archives.

Pré-requis

Interne à PHP 4

La version initiale est fournie avec PHP 4 et est disponible dans PECL depuis la version 1.0, voir http://pecl.php.net/package/zip. Elle ne peut que lire les archives ZIP.

Cette version utilisent les fonctions de la bibliothèque ZZIPlib de Guido Draheim. Vous devez avoir d'installer la bibliothèque ZZIPlib en version >= 0.10.6.

PECL et PHP 5.2 ou suivant

La nouvelle version est fournie avec PHP 5.2.0 ou suivant et est disponible dans PECL depuis la version 1.1.0 ou suivant. Elle ne nécessite pas de bibliothèque externe. Elle peut lire et écrire des archives ZIP lorsqu'elle est utilisée avec PHP 5.1 ou suivant et elle ne peut que les lire lorsqu'elle est utilisée avec PHP 4.

Installation

Cette extension PECL n'est pas intégrée à PHP. Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : http://pecl.php.net/package/zip.

Installation sous Linux

Installation lorsque l'extension est fournie avec PHP 4

Pour pouvoir utiliser ces fonctions, vous devez compiler PHP avec le support ZIP en utilisant l'option de configuration --with-zip[=DIR] où [DIR] est le préfixe de l'installation de la bibliothèque ZZIPlib.

Installation avec PECL ou fournie avec PHP 5.2 et suivant

Pour pouvoir utiliser ces fonctions, vous devez compiler PHP avec le support ZIP en utilisant l'option de configuration --enable-zip. Ceci ne nécessite pas de bibliothèque externe.

Note : Vous pouvez utiliser la version PECL avec PHP 4. Pour cela, vous devez désactiver l'extension ZIP interne ou bien recompiler PHP sans celle-ci.

Installation sous Windows

Installation lorsque l'extension est fournie avec PHP 4

Les utilisateurs de Windows doivent activer la bibliothèque php_zip.dll dans le php.ini pour pouvoir utiliser ces fonctions. En PHP 4, cette bibliothèque DLL se trouve dans le dossier extensions/ avec les binaires PHP pour Windows téléchargées. Vous pouvez télécharger ces bibliothèques DLL pour ces extensions PECL depuis la page de téléchargement de PHP sous sur la page http://snaps.php.net/.

Note : Le support ZIP avant PHP 4.1.0 est expérimental. Cette section traite de l'extension ZIP tel qu'elle existe en PHP 4.1.0 et suivant.

Installation avec PECL ou fournie avec PHP 5.2 et suivant

Les utilisateurs de WIndows doivent activer la bibliothèque php_zip.dll dans le php.ini pour pouvoir utiliser ces fonctions. En PHP 4, cette bibliothèque DLL se trouve dans le dossier extensions/ avec les binaires PHP pour Windows téléchargées. Vous pouvez télécharger ces bibliothèques DLL pour ces extensions PECL depuis la page de téléchargement de PHP sous sur la page http://snaps.php.net/.

Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.

Types de ressources

Il y a deux types de ressources utilisées dans le module ZIP. La première représente le dossier ZIP pour l'archive ZIP, la seconde, l'entrée ZIP pour les entrées de l'archive.

Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

ZipArchive utilise des constantes de classe. Il y a trois types de constantes, les flags (FL_), les erreurs (ER_) ou les modes (no prefix).

ZIPARCHIVE::CREATE (entier)

Crée l'archive si elle n'existe pas.

ZIPARCHIVE::OVERWRITE (entier)

Démarre toujours une nouvelle archive. Ce mode écrase le fichier s'il existe déjà.

ZIPARCHIVE::EXCL (entier)

Erreur si l'archive existe déjà.

ZIPARCHIVE::CHECKCONS (entier)

Effectue des analyses supplémentaires de consistences et émet une erreur si elles échouent.

ZIPARCHIVE::FL_NOCASE (entier)

Ignore la casse sur le nom

ZIPARCHIVE::FL_NODIR (entier)

Ignore le composant dossier

ZIPARCHIVE::FL_COMPRESSED (entier)

Lit les données compressées

ZIPARCHIVE::FL_UNCHANGED (entier)

Utilise les données originales, ignore les modifications

ZIPARCHIVE::CM_DEFAULT (entier)

meilleur compression ou stocke

ZIPARCHIVE::CM_STORE (entier)

stocké (non-compressé)

ZIPARCHIVE::CM_SHRINK (entier)

retrait

ZIPARCHIVE::CM_REDUCE_1 (entier)

réduit de facteur 1

ZIPARCHIVE::CM_REDUCE_2 (entier)

réduit de facteur 2

ZIPARCHIVE::CM_REDUCE_3 (entier)

réduit de facteur 3

ZIPARCHIVE::CM_REDUCE_4 (entier)

réduit de facteur 4

ZIPARCHIVE::CM_IMPLODE (entier)

réunit

ZIPARCHIVE::CM_DEFLATE (entier)

compression

ZIPARCHIVE::CM_DEFLATE64 (entier)

compression 64

ZIPARCHIVE::CM_PKWARE_IMPLODE (entier)

réunit PKWARE

ZIPARCHIVE::CM_BZIP2 (entier)

algorithme BZIP2

ZIPARCHIVE::ER_OK (entier)

Aucune erreur

ZIPARCHIVE::ER_MULTIDISK (entier)

archives ZIP multi-disques non supportées

ZIPARCHIVE::ER_RENAME (entier)

échec du renommage du fichier temporaire

ZIPARCHIVE::ER_CLOSE (entier)

échec de la fermeture de l'archive ZIP

ZIPARCHIVE::ER_SEEK (entier)

erreur de pointeur

ZIPARCHIVE::ER_READ (entier)

erreur de lecture

ZIPARCHIVE::ER_WRITE (entier)

erreur d'écriture

ZIPARCHIVE::ER_CRC (entier)

erreur CRC

ZIPARCHIVE::ER_ZIPCLOSED (entier)

archive ZIP fermée

ZIPARCHIVE::ER_NOENT (entier)

le fichier n'existe pas

ZIPARCHIVE::ER_EXISTS (entier)

le fichier existe déjà

ZIPARCHIVE::ER_OPEN (entier)

impossible d'ouvrir le fichier

ZIPARCHIVE::ER_TMPOPEN (entier)

échec lors de la création du fichier temporaire

ZIPARCHIVE::ER_ZLIB (entier)

erreur Zlib

ZIPARCHIVE::ER_MEMORY (entier)

échec d'allocation mémoire

ZIPARCHIVE::ER_CHANGED (chaîne de caractères)

l'entrée a été modifiée

ZIPARCHIVE::ER_COMPNOTSUPP (entier)

méthode de compression non supportée

ZIPARCHIVE::ER_EOF (entier)

EOF prématuré

ZIPARCHIVE::ER_INVAL (entier)

argument invalide

ZIPARCHIVE::ER_NOZIP (entier)

ce n'est pas une archive ZIP

ZIPARCHIVE::ER_INTERNAL (entier)

erreur interne

ZIPARCHIVE::ER_INCONS (entier)

archive ZIP inconsistente

ZIPARCHIVE::ER_REMOVE (entier)

impossible d'effacer le fichier

ZIPARCHIVE::ER_DELETED (entier)

l'entrée a été supprimée

Exemples

Exemple 1. Création d'une archive ZIP

<?php

$zip
= new ZipArchive();
$filename = "./test112.zip";

if (
$zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
    exit(
"cannot open <$filename>\n");
}

$zip->addFromString("testfilephp.txt" . time(), "#1 Ceci est un test, ajouté en tant que fichier testfilephp.txt.\n");
$zip->addFromString("testfilephp2.txt" . time(), "#2 Ceci est un test, ajouté en tant que fichier testfilephp2.txt.\n");
$zip->addFile($thisdir . "/too.php","/testfromfile.php");
echo
"numfiles: " . $zip->numFiles . "\n";
echo
"status:" . $zip->status . "\n";
$zip->close();
?>

Exemple 2. Affiche les détails de l'archive et liste son contenu

<?php
$za
= new ZipArchive();

$za->open('test_with_comment.zip');
print_r($za);
var_dump($za);
echo
"numFiles: " . $za->numFiles . "\n";
echo
"status: " . $za->status  . "\n";
echo
"statusSys: " . $za->statusSys . "\n";
echo
"filename: " . $za->filename . "\n";
echo
"comment: " . $za->comment . "\n";

for (
$i=0; $i<$za->numFiles;$i++) {
    echo
"index: $i\n";
    
print_r($za->statIndex($i));
}
echo
"Fichier numéro : " . $za->numFiles . "\n";
?>

Exemple 3. Gestionnaire de flux ZIP, lit les méta-informations d'OpenOffice

<?php
$reader
= new XMLReader();

$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while (
$reader->read()) {
if (
$reader->nodeType == XMLREADER::ELEMENT) {
    
$elm = $reader->name;
} else {
    if (
$reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
        break;
    }
    if (!
trim($reader->value)) {
        continue;
    }
    
$odt_meta[$elm] = $reader->value;
}
}
print_r($odt_meta);
?>

Cet exemple utilise l'ancienne API (PHP 4), il ouvre une archive ZIP, lit chaque fichier de l'archive et affiche leurs contenus. L'archive test2.zip utilisé dans cet exemple est une des archives de test des sources de ZZIPlib.

Exemple 4. Exemple d'utilisation Zip

<?php

$zip
= zip_open("/tmp/test2.zip");

if (
$zip) {
    while (
$zip_entry = zip_read($zip)) {
        echo
"Nom :               " . zip_entry_name($zip_entry) . "\n";
        echo
"Taille du fichier :    " . zip_entry_filesize($zip_entry) . "\n";
        echo
"Taille compressée :    " . zip_entry_compressedsize($zip_entry) . "\n";
        echo
"Méthode de compression : " . zip_entry_compressionmethod($zip_entry) . "\n";

        if (
zip_entry_open($zip, $zip_entry, "r")) {
            echo
"Contenu du fichier :\n";
            
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            echo
"$buf\n";

            
zip_entry_close($zip_entry);
        }
        echo
"\n";

    }

    
zip_close($zip);
}
?>
Table des matières
zip_close -- Ferme une archive Zip
zip_entry_close -- Ferme un dossier d'archive
zip_entry_compressedsize -- Lit la taille compressée d'un dossier d'archives
zip_entry_compressionmethod -- Lit la méthode de compression utilisée sur un dossier d'archives
zip_entry_filesize -- Lit la taille décompressée d'un dossier d'archives
zip_entry_name -- Lit le nom d'un dossier d'archives
zip_entry_open -- Ouvre un dossier d'archives en lecture
zip_entry_read -- Lit le contenu d'un fichier dans un dossier
zip_open -- Ouvre une archive ZIP
zip_read -- Lit la prochaine entrée dans une archive ZIP
ZipArchive::addFile -- Ajoute un fichier à l'archive ZIP depuis le chemin fourni
ZipArchive::addFromString -- Ajoute un fichier à une archive ZIP en utilsant son contenu
ZipArchive::close -- Ferme l'archive active (ouverte ou nouvellement créée)
ZipArchive::deleteIndex -- Efface une entrée de l'archive en utilisant son index
ZipArchive::deleteName -- Efface une entrée dans l'archive en utilisant son nom
ZipArchive::extractTo -- Extrait le contenu de l'archive
ZipArchive::getArchiveComment -- Retourne le commentaire de l'archive ZIP
ZipArchive::getCommentIndex -- Retourne le commentaire d'une entrée
ZipArchive::getCommentName -- Retourne le commentaire d'une entrée en utilisant le nom de l'entrée
ZipArchive::getFromIndex -- Retourne le contenu d'une entrée en utilisant son index
ZipArchive::getFromName -- Retourne le contenu de l'entrée en utilisant son nom
ZipArchive::getNameIndex -- Retourne le nom d'une entrée en utilisant son index
ZipArchive::getStream -- Récupère un gestionnaire de fichier pour l'entrée définie par son nom (lecture seul)
ZipArchive::locateName -- Retourne l'index d'une entrée de l'archive
ZipArchive::open -- Ouvre une archive ZIP
ZipArchive::renameIndex -- Renomme une entrée définie par son index
ZipArchive::renameName -- Renomme une entrée définie par son nom
ZipArchive::setArchiveComment -- Définit le commentaire d'une archive ZIP
ZipArchive::setCommentIndex -- Définit le commentaire d'une entrée définie par son index
ZipArchive::setCommentName -- Définit le commentaire d'une entrée spécifiée par son nom
ZipArchive::statIndex -- Récupère les détails d'une entrée définie par son index
ZipArchive::statName -- Récupère les détails de l'entrée définie par son nom
ZipArchive::unchangeAll -- Annule toutes les modifications faites sur l'archive
ZipArchive::unchangeArchive -- Annule toutes les modificatons globales faites sur l'archive
ZipArchive::unchangeIndex -- Annule toutes les modifications faites sur une entrée, définie par nom index
ZipArchive::unchangeName -- Annule toutes les modifications faites sur une entrée, définie par son nom