ホームページ  >  記事  >  バックエンド開発  >  PHPのzip圧縮ツール拡張パッケージを一緒に学びましょう!

PHPのzip圧縮ツール拡張パッケージを一緒に学びましょう!

藏色散人
藏色散人転載
2021-06-04 11:10:522737ブラウズ

この記事では、PHP の zip 圧縮ツール拡張パッケージについて紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

いよいよ PHP の専門分野の時間です。これまでに Bzip2、LZF、Phar、rar 圧縮について学びました。関連する拡張機能が PHP で使用されていますが、あまりにも人気がないか、多くの機能がサポートされていません。 ZIP は、PHP で最も優れた機能サポートを備えた一般的な圧縮形式です。もちろん、これは主に、Zip が Linux 環境における事実上のユニバーサル圧縮形式でもあるという事実によるものです。

インストール

PHP の場合、Zip 拡張機能は PHP インストール パッケージに統合されています。インストール中ではなくても、構成時に --with-zip を直接追加できます。このパラメータを使用すると、ソース コード パッケージの ext/zip でソース コードを見つけて、拡張インストールを通じてインストールすることもできます。

圧縮パッケージを作成する

$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

これまでに学習した rar 拡張子では、ファイルをパッケージ化したり、新しい圧縮パッケージを作成したりすることはできませんが、Zip が登場してすぐに学んだのは、新しい圧縮パッケージを作成することです。パッケージ。 。 ZipArchive オブジェクトをインスタンス化した後、open() 関数を使用して圧縮アーカイブ ファイルを開いたり、作成したりできます。次に、2 つの方法を使用してコンテンツを追加しました。 addFromString() はテキスト タイプのファイルを追加します。つまり、テキストの一部をテキスト ファイルに変換し、この圧縮パッケージに保存します。さらに、addFile() を使用して、この圧縮パッケージに外部ファイルを追加します。

[推奨学習: PHP ビデオ チュートリアル ]

numFiles 属性と status 属性は、それぞれ圧縮パッケージ ファイルと現在の圧縮パッケージ内のファイル数を表示できます。ステータス情報。最後に、close() を使用してハンドルを閉じます。このようにして、単純な Zip アーカイブ ファイルが作成されます。オペレーティング システムの unzip コマンドを直接使用して、圧縮パッケージの内容を表示できます。

圧縮パッケージの内容と情報を読み取る

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

実際、読み取りは同じ手順で、ZipArchive クラスをインスタンス化し、open() を実行して圧縮パッケージ ファイル ハンドルを開きます。これにより、圧縮パッケージの一部の属性情報を直接出力できます。 statIndex() メソッドを通じてループして各ファイル エンティティに関する情報を取得できます。ここで、statIndex() はファイルの内容ではなく、ファイル情報を取得することに注意してください。

もちろん、getFromIndex() または getFromName() を通じて指定されたファイルを直接取得することもできます。 renameName() を使用して圧縮パッケージ内のファイルの名前を直接変更し、extractTo() を使用して指定したファイルまたは圧縮パッケージ全体を指定したディレクトリに抽出します。 extractTo() メソッドの 2 番目のパラメーターでコンテンツを指定すると、指定されたファイルのみが解凍されます。

ディレクトリの圧縮、ストリームおよび疑似プロトコル メソッドでの設定手順とファイルの読み取り

圧縮パッケージ ツールであるため、最も一般的に使用されるのは、複数のファイルまたはディレクトリを直接パッケージ化することです。同時に、いくつかの指示やパスワードなどを設定できる圧縮パッケージも多数あります。さらに、専用の zip:// 擬似プロトコルを通じて、圧縮パッケージ内のファイルのコンテンツを直接取得することもできます。これらの関数は、PHP Zip 拡張機能で非常に簡単かつ便利に使用できます。

圧縮ディレクトリ

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

addGlobを直接使用すると、特定のファイル ディレクトリ内のすべてのファイルの内容をパッケージ化することができます。同時に、その 3 番目のパラメーターで、圧縮パッケージ内のこれらのファイルのパス アドレスを指定することもできます。

設定手順とパスワード

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

圧縮パッケージを設定するための手順、コメント、パスワードはすべて既製の関数メソッドをそのまま使用できます。オペレーティング システムの unzip コマンドを再度使用して、圧縮パッケージの注釈情報とパッケージ化されたディレクトリの内容を表示できます。最初にテストした test_zip/ ディレクトリの内容は、カスタマイズした圧縮パッケージ内のパス アドレスである new_path/ ディレクトリに配置されました。

ストリームと疑似プロトコルを使用してファイルを読み取る

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

まず、getStream() メソッドを通じて、圧縮パッケージ内のファイルのストリームを直接取得します。このメソッドは、ほとんどすべての圧縮で使用されます。ファイルを読み取る方法を提供します。次のメソッドでは、zip:// 疑似プロトコルを使用して、 fopen() 関数と file_get_contents() 関数を直接使用して、圧縮パッケージ内のファイルを読み取ります。このような便利な疑似プロトコルが使えるようになったので、ファイルを取得して解凍することは非常に簡単になり、copy() 関数を使用してファイルをコピーするだけで済みます。

总结

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

以上がPHPのzip圧縮ツール拡張パッケージを一緒に学びましょう!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。