溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中zip壓縮工具擴展包怎么用

發(fā)布時間:2021-06-04 11:45:32 來源:億速云 閱讀:178 作者:小新 欄目:編程語言

這篇文章主要介紹了PHP中zip壓縮工具擴展包怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

總算到了 PHP 的拿手好戲上場了,前面我們學(xué)習(xí)過 Bzip2 、 LZF 、 Phar 和 rar 這些壓縮相關(guān)擴展在 PHP 中的使用,不過它們要么是太冷門,要么就是很多功能不支持。而 Zip 則是在 PHP 中得到最大幅度功能支持的熱門壓縮格式,或者說是通用常見的一種壓縮格式。當(dāng)然,也主要得益于 Zip 也是事實上的 Linux 環(huán)境中的通用壓縮格式。

安裝

對于 PHP 來說,Zip 擴展已經(jīng)集成在了 PHP 的安裝包中,在 Configure 的時候可以直接加上 --with-zip ,如果在安裝的時候沒有加上這個參數(shù),我們也可以在源碼包的 ext/zip 下找到源碼,然后通過擴展安裝的方式進行安裝。

創(chuàng)建一個壓縮包

$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; // 文件數(shù)量
echo $zip->status, PHP_EOL; // 壓縮包狀態(tài)
$zip->close();

// 使用操作系統(tǒng)的 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

之前學(xué)習(xí)過的 rar 擴展是無法打包文件或者創(chuàng)建新的壓縮包的,而 Zip 一上來我們就學(xué)習(xí)的是創(chuàng)建一個新的壓縮包。通過實例化一個 ZipArchive 對象后,我們就可以使用 open() 函數(shù)打開或創(chuàng)建一個壓縮包文件。接著,我們使用了兩種添加內(nèi)容的方式。addFromString() 是加入文字類型的文件,也就是將一段文字轉(zhuǎn)換成文本文件保存在這個壓縮包中。另外,我們通過 addFile() 來將外部的文件加入到這個壓縮包中。

numFiles 和 status 屬性可以分別查看到壓縮包文件里面的文件數(shù)量及當(dāng)前這個壓縮包的狀態(tài)信息。最后直接使用 close() 關(guān)閉句柄即可。這樣,一個簡單的 Zip 壓縮包文件就創(chuàng)建完成了。我們可以直接使用操作系統(tǒng)的 unzip 命令來查看壓縮包的內(nèi)容。

讀取壓縮包內(nèi)容及信息

$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']);
    }
}

// 修改壓縮包內(nèi)的文件名
$zip->renameName('newrar.php', 'newrar2.php');
print_r($zip->getFromIndex(2)); // 獲取第二個文件的內(nèi)容
print_r($zip->getFromName('newrar2.php')); // 獲取指定文件名的文件內(nèi)容

$zip->extractTo('./test_zip'); // 解壓整個壓縮包到指定目錄

$zip->close();

其實讀取也是同樣的步驟,實例化一個 ZipArchive 類,然后 open() 打開一個壓縮包文件句柄。接著就可以直接輸出一些壓縮包的屬性信息。我們可以通過循環(huán)并通過 statIndex() 方法獲取每個文件實體的信息。這里需要注意的是 statIndex() 獲取的是文件的信息,而不是這個文件的內(nèi)容。

當(dāng)然,我們也可以通過 getFromIndex() 或 getFromName() 直接獲取指定的文件。通過 renameName() 直接給壓縮包內(nèi)部的文件改名,通過 extractTo() 將指定的文件或者整個壓縮包解壓到指定的目錄中。extractTo() 方法的第二個參數(shù)如果指定了內(nèi)容,則只會解壓指定的這個文件。

壓縮目錄,設(shè)置說明以及流、偽協(xié)議方式讀取文件

既然是壓縮包工具,那么我們最常用的也就是直接將多個文件或者目錄進行打包。同時,也有很多壓縮包可以設(shè)置一些說明、密碼什么的。另外,我們還可以通過專屬的 zip:// 偽協(xié)議來直接獲取壓縮包內(nèi)某個文件的內(nèi)容。這些功能,在 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 就可以幫助我們完成對某個文件目錄下的所有文件的內(nèi)容打包。同時,它的第三個參數(shù)也可以指定這些文件在壓縮包內(nèi)部的路徑地址。

設(shè)置說明及密碼

// 設(shè)置注釋、密碼
$zip->setArchiveComment('This is rar Comment!');
$zip->setPassword('123');
$zip->close();

// 使用操作系統(tǒng) 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

設(shè)置壓縮包的說明注釋以及密碼都是有現(xiàn)成的函數(shù)方法直接使用的。我們再次通過操作系統(tǒng)的 unzip 命令,就可以查看到這個壓縮包的注釋信息以及打包的目錄內(nèi)容。本來測試的 test_zip/ 目錄下的內(nèi)容被放在了 new_path/ 目錄下,這就是我們自定的一個壓縮包內(nèi)部的路徑地址。

流、偽協(xié)議方式讀取文件

// 流、偽協(xié)議方法讀取壓縮包內(nèi)容
$zip = new ZipArchive();
$zip->open('./test_zip2.zip');

// 獲取文件流
$fp = $zip->getStream('newrar.php');
while(!feof($fp)){
   echo fread($fp, 2);
}
fclose($fp);

// 使用偽協(xié)議
$fp = fopen('zip://' . dirname(__FILE__) . '/test_zip2.zip#newrar.php', 'r');
while(!feof($fp)){
   echo fread($fp, 2);
}
fclose($fp);

// file_get_contents 使用偽協(xié)議
echo file_get_contents('zip://' . dirname(__FILE__) . '/test_zip2.zip#newrar.php');

// 直接使用偽協(xié)議將文件拷貝出來
copy('zip://' . dirname(__FILE__) . '/test_zip2.zip#newrar.php', './newrar2.php');

首先,我們通過 getStream() 方法直接獲取壓縮包中某個文件的流,這種方式幾乎是所有壓縮類擴展都會提供的一種讀取文件的方式。而下面的方式則是通過 zip:// 偽協(xié)議直接使用 fopen() 、 file_get_contents() 函數(shù)來讀取壓縮包內(nèi)部的某個文件。既然有了這么方便的一個偽協(xié)議,那么我們要簡單的獲取并解壓某個文件也就變得十分容易了,直接使用 copy() 函數(shù)將這個文件拷貝出來就可以了。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“PHP中zip壓縮工具擴展包怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI