>백엔드 개발 >PHP 튜토리얼 >PHP의 zip 압축 도구 확장 패키지를 함께 배우자!

PHP의 zip 압축 도구 확장 패키지를 함께 배우자!

藏色散人
藏色散人앞으로
2021-06-04 11:10:522841검색

이 글에서는 PHP의 zip 압축 도구 확장 패키지를 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

마지막으로 PHP의 전문 분야를 배울 차례입니다. 이전에는 PHP에서 Bzip2, LZF, Phar 및 rar과 같은 압축 관련 확장 기능을 사용하는 방법을 배웠지만 둘 중 하나입니다. 인기가 없거나 많은 기능이 지원되지 않습니다. Zip은 PHP에서 가장 큰 기능 지원을 제공하는 널리 사용되는 압축 형식이거나 일반적인 압축 형식입니다. 물론 이는 주로 Zip이 Linux 환경에서 사실상 범용 압축 형식이기 때문입니다.

Installation

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() 함수를 사용하여 압축된 아카이브 파일을 열거나 생성할 수 있습니다. 다음으로 콘텐츠를 추가하는 두 가지 방법을 사용했습니다. addFromString()은 텍스트 형태의 파일을 추가하는 것, 즉 텍스트의 일부를 텍스트 파일로 변환하여 이 압축 패키지에 저장하는 것입니다. 또한 addFile()을 사용하여 이 압축 패키지에 외부 파일을 추가합니다.

[추천 학습: PHP 비디오 튜토리얼]

numFiles 및 상태 속성은 각각 압축된 패키지 파일의 파일 수와 현재 압축된 패키지의 상태 정보를 볼 수 있습니다. 마지막으로 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() 메소드의 두 번째 매개변수가 컨텐츠를 지정하는 경우 지정된 파일만 압축 해제됩니다.

스트리밍 및 의사 프로토콜 방식의 압축 디렉터리, 설정 지침 및 파일 읽기

압축 패키지 도구이므로 가장 일반적으로 사용되는 도구는 여러 파일이나 디렉터리를 직접 패키지하는 것입니다. 동시에 일부 지침, 비밀번호 등을 설정할 수 있는 압축 패키지도 많이 있습니다. 또한, 독점적인 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을 직접 사용하면 특정 파일 디렉터리에 있는 모든 파일의 내용을 패키지하는 데 도움이 될 수 있습니다. 동시에 세 번째 매개변수는 압축된 패키지 내에서 이러한 파일의 경로 주소를 지정할 수도 있습니다.

설정 지침 및 비밀번호

// 设置注释、密码
$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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제