總算到了 PHP 的拿手好戲上場了,前面我們學習過 Bzip2 、 LZF 、 Phar 和 rar 這些壓縮相關擴展在 PHP 中的使用,不過它們要么是太冷門,要么就是很多功能不支持,而 Zip 則是在 PHP 中得到最大幅度功能支持的熱門壓縮格式,或者說是通用常見的一種壓縮格式,當然,也主要得益于 Zip 也是事實上的 Linux 環境中的通用壓縮格式,
安裝
對于 PHP 來說,Zip 擴展已經集成在了 PHP 的安裝包中,在 Configure 的時候可以直接加上 --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() 來將外部的檔案加入到這個壓縮包中,
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; $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();
其實讀取也是同樣的步驟,實體化一個 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
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/285579.html
標籤:PHP
上一篇:PHP的rar解壓讀取擴展包學習
