Heim  >  Artikel  >  Backend-Entwicklung  >  Lassen Sie uns gemeinsam das Zip-Komprimierungstool-Erweiterungspaket von PHP lernen!

Lassen Sie uns gemeinsam das Zip-Komprimierungstool-Erweiterungspaket von PHP lernen!

藏色散人
藏色散人nach vorne
2021-06-04 11:10:522788Durchsuche

Dieser Artikel stellt Ihnen das Erweiterungspaket für das Zip-Komprimierungstool von PHP vor. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Endlich ist es Zeit für die PHP-Spezialität. Zuvor haben wir etwas über die Verwendung von komprimierungsbezogenen Erweiterungen wie Bzip2, LZF, Phar und rar in PHP gelernt, aber beides auch unbeliebt oder viele Funktionen werden nicht unterstützt. Zip ist ein beliebtes Komprimierungsformat mit der größten Funktionsunterstützung in PHP oder ein gängiges Komprimierungsformat. Das liegt natürlich vor allem daran, dass Zip auch im Linux-Umfeld das de facto universelle Komprimierungsformat ist.

Installation

Für PHP wurde die Zip-Erweiterung in das PHP-Installationspaket integriert. Sie können --with-zip beim Konfigurieren direkt hinzufügen. Wenn dieser Parameter nicht während der Installation hinzugefügt wird, können wir den Quellcode auch unter ext /zip des Quellcodepakets und installieren Sie es dann über die erweiterte Installation.

Erstellen Sie ein komprimiertes Paket

$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

Die rar-Erweiterung, die wir zuvor gelernt haben, kann keine Dateien packen oder neue komprimierte Pakete erstellen, aber was wir gelernt haben, als Zip eingeführt wurde, ist, ein neues komprimiertes Paket zu erstellen. Nach der Instanziierung eines ZipArchive-Objekts können wir die Funktion open() verwenden, um eine komprimierte Archivdatei zu öffnen oder zu erstellen. Als Nächstes haben wir zwei Methoden zum Hinzufügen von Inhalten verwendet. addFromString () dient zum Hinzufügen einer Texttypdatei, dh zum Konvertieren eines Textabschnitts in eine Textdatei und zum Speichern in diesem komprimierten Paket. Darüber hinaus verwenden wir addFile(), um externe Dateien zu diesem komprimierten Paket hinzuzufügen.

[Empfohlenes Lernen: PHP-Video-Tutorial]

Die Attribute „numFiles“ und „status“ können jeweils die Anzahl der Dateien in der komprimierten Paketdatei und die Statusinformationen des aktuellen komprimierten Pakets anzeigen. Zum Schluss verwenden Sie einfach close(), um das Handle zu schließen. Auf diese Weise wird eine einfache Zip-Archivdatei erstellt. Wir können den Inhalt des komprimierten Pakets direkt mit dem Unzip-Befehl des Betriebssystems anzeigen.

Lesen Sie den Inhalt und die Informationen des komprimierten Pakets

$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; $i6402c35395f59f31de0f02c0a49ca0d0numFiles;$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();

Tatsächlich ist das Lesen der gleiche Schritt: Instanziieren Sie eine ZipArchive-Klasse und öffnen Sie dann ein komprimiertes Paketdateihandle. Anschließend können Sie einige Attributinformationen des komprimierten Pakets direkt ausgeben. Über die Methode statIndex() können wir eine Schleife durchlaufen und Informationen zu jeder Dateientität abrufen. Hierbei ist zu beachten, dass statIndex() Dateiinformationen und nicht den Inhalt der Datei erhält.

Natürlich können wir die angegebene Datei auch direkt über getFromIndex() oder getFromName() abrufen. Verwenden Sie renameName(), um die Dateien im komprimierten Paket direkt umzubenennen, und extractTo(), um die angegebene Datei oder das gesamte komprimierte Paket in das angegebene Verzeichnis zu extrahieren. Wenn der zweite Parameter der Methode extractTo() den Inhalt angibt, wird nur die angegebene Datei dekomprimiert.

Komprimierte Verzeichnisse, Einstellungsanweisungen und Lesen von Dateien in Streaming- und Pseudoprotokollmethoden

Da es sich um ein Komprimierungspaket-Tool handelt, besteht das am häufigsten verwendete darin, mehrere Dateien oder Verzeichnisse direkt zu verpacken. Gleichzeitig gibt es auch viele komprimierte Pakete, in denen Sie einige Anweisungen, Passwörter usw. festlegen können. Darüber hinaus können wir den Inhalt einer Datei im komprimierten Paket auch direkt über das exklusive Pseudoprotokoll zip:// abrufen. Diese Funktionen lassen sich sehr einfach und komfortabel in der PHP-Zip-Erweiterung nutzen.

Komprimiertes Verzeichnis

// 压缩目录
$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/']);

Die direkte Verwendung von addGlob kann uns dabei helfen, den Inhalt aller Dateien in einem bestimmten Dateiverzeichnis zu packen. Gleichzeitig kann sein dritter Parameter auch die Pfadadresse dieser Dateien innerhalb des komprimierten Pakets angeben.

Anweisungen und Passwort festlegen

// 设置注释、密码
$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

Es gibt vorgefertigte Funktionsmethoden zum Festlegen von Anweisungen, Kommentaren und Passwörtern für komprimierte Pakete, die direkt verwendet werden können. Wir können den Unzip-Befehl des Betriebssystems erneut verwenden, um die Anmerkungsinformationen des komprimierten Pakets und den Inhalt des gepackten Verzeichnisses anzuzeigen. Der Inhalt des ursprünglich getesteten Verzeichnisses test_zip/ wurde im Verzeichnis new_path/ abgelegt, das die Pfadadresse innerhalb des von uns angepassten komprimierten Pakets ist.

Dateien mit Streaming- und Pseudoprotokollmethoden lesen

// 流、伪协议方法读取压缩包内容
$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');

Zunächst erhalten wir den Stream einer Datei im komprimierten Paket über die Methode getStream(). Diese Methode wird von fast allen Komprimierungserweiterungen zum Lesen von Dateien bereitgestellt. Die folgende Methode verwendet das Pseudoprotokoll zip://, um die Funktionen fopen() und file_get_contents() direkt zum Lesen einer Datei im komprimierten Paket zu verwenden. Da wir nun über ein so praktisches Pseudoprotokoll verfügen, ist es für uns sehr einfach, eine Datei abzurufen und zu dekomprimieren. Wir können die Datei einfach mit der Funktion copy() kopieren.

总结

是不是感觉比 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

Das obige ist der detaillierte Inhalt vonLassen Sie uns gemeinsam das Zip-Komprimierungstool-Erweiterungspaket von PHP lernen!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen