Enfin, il est temps de passer à la spécialité de PHP. Auparavant, nous avons découvert la compression Bzip2, LZF, Phar et rar. les extensions sont utilisées en PHP, mais soit elles sont trop impopulaires, soit de nombreuses fonctions ne sont pas prises en charge. Zip est un format de compression populaire avec le plus grand support fonctionnel en PHP, ou c'est un format de compression courant. Bien entendu, cela est principalement dû au fait que Zip est également le format de compression universel de facto dans l’environnement Linux.
Installation
Pour PHP, l'extension Zip a été intégrée au package d'installation de PHP Vous pouvez ajouter directement --with-zip lors de la configuration, sinon lors de l'installation Avec ce paramètre, nous pouvons. recherchez également le code source sous ext/zip du package de code source, puis installez-le via une installation étendue.
Créer un package compressé
$zip = new ZipArchive(); $filename = './test_zip.zip'; if($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE){ exit('cannot open ' . $filename .'\n'); } // 加入文字类型的文件 $zip->addFromString('testfile1.txt' . time(), "#1"); $zip->addFromString('testfile2.txt' . time(), "#2"); // 加入已存在的文件 $zip->addFile('rar.php', 'newrar.php'); echo $zip->numFiles, PHP_EOL; // 文件数量 echo $zip->status, PHP_EOL; // 压缩包状态 $zip->close(); // 使用操作系统的 unzip 查看 // # unzip -l test_zip.zip // Archive: test_zip.zip // Length Date Time Name // --------- ---------- ----- ---- // 2 07-08-2020 08:57 testfile1.txt1594169845 // 2 07-08-2020 08:57 testfile2.txt1594169845 // 2178 07-07-2020 08:55 newrar2.php // --------- ------- // 2182 3 files
L'extension rar que nous avons apprise auparavant ne peut pas empaqueter de fichiers ni créer de nouveaux packages compressés, mais ce que nous avons appris dès l'introduction de Zip est de créer un nouveau package compressé . Après avoir instancié un objet ZipArchive, nous pouvons utiliser la fonction open() pour ouvrir ou créer un fichier d'archive compressé. Ensuite, nous avons utilisé deux méthodes pour ajouter du contenu. addFromString() consiste à ajouter un fichier de type texte, c'est-à-dire convertir un morceau de texte en fichier texte et l'enregistrer dans ce package compressé. De plus, nous utilisons addFile() pour ajouter des fichiers externes à ce package compressé.
[Apprentissage recommandé : Tutoriel vidéo PHP]
Les attributs numFiles et status permettent respectivement d'afficher le nombre de fichiers dans le fichier du package compressé et le fichier compressé actuel. informations sur l'état du paquet. Enfin, utilisez simplement close() pour fermer le handle. De cette façon, un simple fichier d'archive Zip est créé. Nous pouvons directement utiliser la commande unzip du système d'exploitation pour afficher le contenu du package compressé.
Lire le contenu et les informations du package compressé
$zip = new ZipArchive(); $zip->open('./test_zip.zip'); print_r($zip); // 压缩包信息 // ZipArchive Object // ( // [status] => 0 // [statusSys] => 0 // [numFiles] => 40 // [filename] => /data/www/blog/test_zip.zip // [comment] => // ) var_dump($zip); // object(ZipArchive)#2 (5) { // ["status"]=> // int(0) // ["statusSys"]=> // int(0) // ["numFiles"]=> // int(40) // ["filename"]=> // string(27) "/data/www/blog/test_zip.zip" // ["comment"]=> // string(0) "" // } echo $zip->numFiles, PHP_EOL; echo $zip->status, PHP_EOL; echo $zip->statusSys, PHP_EOL; echo $zip->filename, PHP_EOL; echo $zip->comment, PHP_EOL; echo $zip->count(), PHP_EOL; for ($i=0; $i<$zip->numFiles;$i++) { echo "index: $i\n"; // 打印每个文件实体信息 print_r($zip->statIndex($i)); // index: 0 // Array // ( // [name] => testfile1.txt1594169845 // [index] => 0 // [crc] => 2930664868 // [size] => 2 // [mtime] => 1594169844 // [comp_size] => 2 // [comp_method] => 0 // [encryption_method] => 0 // ) // …… $entry = $zip->statIndex($i); if($entry['name'] == 'newrar.php'){ // 仅解压 newrar.php 文件到指定目录 $zip->extractTo('./test_zip_single', $entry['name']); } } // 修改压缩包内的文件名 $zip->renameName('newrar.php', 'newrar2.php'); print_r($zip->getFromIndex(2)); // 获取第二个文件的内容 print_r($zip->getFromName('newrar2.php')); // 获取指定文件名的文件内容 $zip->extractTo('./test_zip'); // 解压整个压缩包到指定目录 $zip->close();
En fait, la lecture est la même étape, instancier une classe ZipArchive, puis open() un descripteur de fichier de package compressé. Ensuite, vous pouvez directement afficher certaines informations d'attribut du package compressé. Nous pouvons parcourir et obtenir des informations sur chaque entité de fichier via la méthode statIndex(). Il convient de noter ici que statIndex() obtient des informations sur le fichier, pas le contenu du fichier.
Bien sûr, nous pouvons également obtenir directement le fichier spécifié via getFromIndex() ou getFromName(). Utilisez renameName() pour renommer directement les fichiers à l'intérieur du package compressé et utilisez extractTo() pour extraire le fichier spécifié ou l'intégralité du package compressé dans le répertoire spécifié. Si le deuxième paramètre de la méthode extractTo() spécifie le contenu, seul le fichier spécifié sera décompressé.
Répertoires compressés, instructions de configuration et lecture de fichiers via des flux et des pseudo-protocoles
Comme il s'agit d'un outil de package de compression, le plus couramment utilisé consiste à empaqueter directement plusieurs fichiers ou répertoires. Dans le même temps, il existe également de nombreux packages compressés dans lesquels vous pouvez définir des instructions, des mots de passe, etc. De plus, nous pouvons également obtenir directement le contenu d'un fichier dans le package compressé via le pseudo-protocole exclusif zip://. Ces fonctions peuvent être utilisées très facilement et commodément dans l'extension PHP Zip.
Répertoire compressé
// 压缩目录 $zip = new ZipArchive(); $zip->open('./test_zip2.zip', ZIPARCHIVE::CREATE); $zip->addFile('rar.php', 'newrar.php'); $zip->addGlob('./test_zip/*.{php,txt}', GLOB_BRACE, ['add_path'=> 'new_path/']);
L'utilisation directe d'addGlob peut nous aider à regrouper le contenu de tous les fichiers dans un certain répertoire de fichiers. Dans le même temps, son troisième paramètre peut également spécifier l'adresse du chemin de ces fichiers à l'intérieur du package compressé.
Instructions de configuration et mot de passe
// 设置注释、密码 $zip->setArchiveComment('This is rar Comment!'); $zip->setPassword('123'); $zip->close(); // 使用操作系统 unzip 查看 // # unzip -l test_zip2.zip // Archive: test_zip2.zip // This is rar Comment! // Length Date Time Name // --------- ---------- ----- ---- // 2178 07-07-2020 08:55 newrar.php // 2178 07-08-2020 10:36 new_path/./test_zip/newrar.php // 2178 07-08-2020 10:36 new_path/./test_zip/newrar2.php // --------- ------- // 6534 3 files
Les instructions, les commentaires et le mot de passe pour définir le package compressé sont toutes des méthodes fonctionnelles prêtes à l'emploi qui peuvent être utilisées directement. Nous pouvons à nouveau utiliser la commande unzip du système d'exploitation pour afficher les informations d'annotation du package compressé et le contenu du répertoire empaqueté. Le contenu du répertoire test_zip/ initialement testé a été placé dans le répertoire new_path/, qui est l'adresse du chemin à l'intérieur du package compressé que nous avons personnalisé.
Lire les fichiers à l'aide de flux et de pseudo-protocoles
// 流、伪协议方法读取压缩包内容 $zip = new ZipArchive(); $zip->open('./test_zip2.zip'); // 获取文件流 $fp = $zip->getStream('newrar.php'); while(!feof($fp)){ echo fread($fp, 2); } fclose($fp); // 使用伪协议 $fp = fopen('zip://' . dirname(__FILE__) . '/test_zip2.zip#newrar.php', 'r'); while(!feof($fp)){ echo fread($fp, 2); } fclose($fp); // file_get_contents 使用伪协议 echo file_get_contents('zip://' . dirname(__FILE__) . '/test_zip2.zip#newrar.php'); // 直接使用伪协议将文件拷贝出来 copy('zip://' . dirname(__FILE__) . '/test_zip2.zip#newrar.php', './newrar2.php');
Tout d'abord, nous obtenons directement le flux d'un fichier dans le package compressé via la méthode getStream(). Cette méthode est utilisée par presque toutes les compressions. extensions de classe. Fournit un moyen de lire des fichiers. La méthode suivante utilise le pseudo-protocole zip:// pour utiliser directement les fonctions fopen() et file_get_contents() pour lire un fichier à l'intérieur du package compressé. Maintenant que nous disposons d’un pseudo-protocole aussi pratique, il devient très facile pour nous d’obtenir et de décompresser simplement un fichier. Nous pouvons simplement utiliser la fonction copy() pour copier le fichier.
总结
是不是感觉比 rar 的操作强大了许多。都说了这是 PHP 主力支持的一种通用压缩格式,所以当然功能会丰富许多,而且还有很多的函数方法我们并没有全部列出来,如果全列出来的话还不如大家自己去看手册呢。这里就是以一些简单的例子让大家看到这类扩展功能的操作,方便大家在业务选型的时候能够快速的联想到我们 PHP 就已经提供了这些现成的扩展。需要了解 Zip 其它内容的同学可以移步最下方的链接直接进入手册中查阅。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84zip%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7%E6%89%A9%E5%B1%95%E5%8C%85%E5%AD%A6%E4%B9%A0.php 参考文档:https://www.php.net/manual/zh/book.zip.php