3. 使用PHP函數exec()執行Linux下的壓縮zip,解壓縮unzip命令github
使用以前要將php.ini文件中的zlib.output_compression設置爲On 配置參考數組
function addFileToZip($path, $current, $zip) {
// 打開文件夾資源
$handler = opendir($path);
// 循環讀取文件夾內容
while(($filename = readdir($handler)) !== false) {
// 過濾掉Linux系統下的.和..文件夾
if ($filename != '.' && $filename != '..') {
// 文件指針當前位置指向的若是是文件夾,就遞歸壓縮
if (is_dir($path.'/'.$filename)) {
addFileToZip($path.'/'.$filename, $filename, $zip);
} else {
// 爲了在壓縮文件的同時也將文件夾壓縮,能夠設置第二個參數爲文件夾/文件的形式,文件夾不存在自動建立壓縮文件夾
$zip->addFile($path.'/'.$filename, $current.'/'.$filename);
}
}
}
@closedir($handler);
}
$zipName = '生成壓縮文件的路徑';
// 若是壓縮文件不存在,就建立壓縮文件
if (! is_file($zipName)) {
$fp = fopen($zipName, 'w');
fclose($fp);
}
$zip = new \ZipArchive();
// OVERWRITE選項表示每次壓縮時都覆蓋原有內容,可是若是沒有那個壓縮文件的話就會報錯,因此事先要建立好壓縮文件
// 也可使用CREATE選項,此選項表示每次壓縮時都是追加,不是覆蓋,若是事先壓縮文件不存在會自動建立
if ($zip->open($zipName, \ZipArchive::OVERWRITE) === true) {
       $current = '你要壓縮的文件的主目錄';
$compress->addFileToZip($path, $current, $zip);
$zip->close();
} else {
exit('打開zip文件失敗!');
}
?>
複製代碼
PclZip library可以壓縮與解壓縮Zip格式的壓縮檔(WinZip、PKZIP);且能對此類類檔案進行處理,包括產生壓縮檔、列出壓縮檔的內容以及解壓縮檔案等等。因爲可以在伺服器端進行壓縮與解壓縮的動做,因此至關方便使用。 PclZip定義一個PclZip類別,其類別物件可視爲一個ZIP檔案,亦提供method來進行處理。函數
<?php
// 加載類文件
require_once('PclZip.php');
// 初始化類
$zip = new PclZip("archive.zip");
$result = $zip->create($_SERVER['DOCUMENT_ROOT'],PCLZIP_OPT_REMOVE_PATH,$_SERVER['DOCUMENT_ROOT']);
if($result == 0){
echo '異常信息:'.$z->errorInfo(true);}
else{
echo '成功';
}
?>
複製代碼
<?php
// 解壓縮到extract/folder/這個目錄中
$result = $archive->extract(PCLZIP_OPT_PATH,"extract/folder/");
// 增長這個目錄在壓縮檔中,完成之後壓縮檔裏面會有backup這個目錄,backup裏面會有這兩個檔案
$result = $archive->create("file.txt,image.gif",PCLZIP_OPT_ADD_PATH,"backup");
// 去掉部份的路徑,這裏完成後會變成test/file.txt
$result = $archive->add("/usr/local/user/test/file.txt",PCLZIP_OPT_REMOVE_PATH,"/usr/local/user");
// 把全部路徑都去掉,這個壓縮檔創建完後,裏面就只會有file.txt跟image.gif,不會有目錄了
$result = $archive->create("data/file.txt images/image.gif",PCLZIP_OPT_REMOVE_ALL_PATH);
// 把解壓縮出來的檔案的CHMOD設成0777
$result = $archive->extract(PCLZIP_OPT_SET_CHMOD,0777);
// 解壓縮部份的檔案,這個參數是使用檔案名稱判別
// 引數能夠用下面這樣的陣列
$list = array('test/abc.txt', 'test/efg.txt');
// 或是下面這樣,一個字串中,用逗號分隔每一個要解壓縮的檔案
$list = "test/abc.txt,test/efg.txt";
$result = $archive->extract(PCLZIP_OPT_BY_NAME, $list);
//解壓縮部份的檔案,使用php的ereg()函式,檔案名稱有比對成功的都會被解壓縮
$result = $archive->extract(PCLZIP_OPT_BY_EREG,"aa");
// 解壓縮部份的檔案,使用php的preg_match()函式,檔案名稱有比對成功的都會被解壓縮
$result = $archive->extract(PCLZIP_OPT_BY_PREG,"/^bb/");
// 依照陣列中元素的索引解壓縮
$result = $archive->extract(PCLZIP_OPT_BY_INDEX,array('0-1','6-7'));
// 將一個檔案內容解壓縮成一個字串
$result = $archive->extract(PCLZIP_OPT_BY_NAME,"data/readme.txt",PCLZIP_OPT_EXTRACT_AS_STRING);
// 將一個檔案內容解壓縮完後直接輸出(echo)
$result = $archive->extract(PCLZIP_OPT_BY_NAME,"data/readme.txt",PCLZIP_OPT_EXTRACT_IN_OUTPUT);
// 將一個檔案加入一個壓縮檔中,但不會對此檔案壓縮
$result = $archive->add("data/file.txt", PCLZIP_OPT_NO_COMPRESSION);
// 對此壓縮檔增長一個註解,若是本來就有註解的話會被覆蓋掉
$result = $archive->create("data", PCLZIP_OPT_COMMENT,"Add a comment");
// 對此壓縮檔增長一個註解,若是本來就有註解的話會接在後面
$result = $archive->add("data", PCLZIP_OPT_ADD_COMMENT,"Add a comment after the existing one");
// 對此壓縮檔增長一個註解,若是本來就有註解的話會放在本來的註解前面
$result = $archive->add("data", PCLZIP_OPT_PREPEND_COMMENT,"Add a comment before the existing one");
?>
複製代碼
3. PHP自帶函數exec()執行Linux下的壓縮zip,解壓縮unzip命令ui
exec — 執行一個外部程序 (PHP 4, PHP 5, PHP 7)加密
- 語法:exec ( string
output [, int &$return_var ]] ) : string
output: shell命令的輸出填充此數組,每行輸出填充數組中的一個元素。 請注意,若是數組中已經包含了部分元素,exec() 函數會在數組末尾追加內容。若是你不想在數組末尾進行追加,請在傳入 exec() 函數以前 對數組使用 unset() 函數進行重置。 $return_var: 命令執行後的返回狀態,命令執行成功值是0。spa
固然也可使用system()函數。
exec("zip -P $password $zipFile $fileList", $outputs, $rc);
//參數講解:
// -P,加密壓縮,解壓的時候會詢問密碼
// $password,文件壓縮自定義密碼
// $zipFile,壓縮生成的文件路徑
// $fileList,須要壓縮的文件路徑字符串,多個時逗號隔開
exec("zip -P $password -m $zipFile $addfile", $outputs, $rc);// -m,將$addfile文件加入$zipFile壓縮文件中
exec("zip -P $psw -d $zipFile $removeFile", $outputs, $rc);// -d,從壓縮文件$zipFile內刪除指定的文件$removeFile
exec("unzip -P $password -o $zipFile -d $unzipFilePath", $outputs, $rc);
// -o,沒必要先詢問用戶,unzip執行後覆蓋原有文件
// -d,指定解壓路徑
複製代碼
-r 遞歸,將指定目錄下的全部文件和子目錄一併處理
-S 包含系統和隱藏文件
-y 直接保存符號鏈接,而非該鏈接所指向的文件
-X 不保存額外的文件屬性
-m 將文件壓縮並加入壓縮文件後,刪除源文件
-<壓縮級別> 1~9,數字越大,壓縮率越高
-F 嘗試修復已損壞的壓縮文件
-T 檢查備份文件內的每一個文件是否正確無誤
-q 不顯示指令執行過程
-g 將文件壓縮後附加在既有的壓縮文件以後,而非另行創建新的壓縮文件
-u 更新壓縮包內文件
-f 更新壓縮包內文件。若是符合條件的文件沒有包含在壓縮包中,則壓縮後添加
-$ 保存第一個被壓縮文件所在磁盤的卷標
-j 只保存文件名稱及其內容
-D 壓縮文件內不創建目錄名稱
-i <表達式> 壓縮目錄時,只壓縮符合條件的文件
-x <表達式> 排除符合條件的文件
-n <文件名後綴> 排除指定文件名後綴的文件
-b <緩存路徑> 指定臨時文件目錄
-d <表達式> 從壓縮文件內刪除指定的文件
-t <日期時間> 把壓縮文件的日期設成指定的日期
-o 以壓縮文件內擁有最新更改時間的文件爲準,將壓縮文件的更改時間設成和該文件相同
-A 調整可執行的自動解壓縮文件
-c 替每一個被壓縮的文件加上註釋
-z 替壓縮文件加上註釋
-k 使用MS-DOS兼容格式的文件名稱。
-l 壓縮文件時,把LF字符置換成LF+CR字符。
-ll 壓縮文件時,把LF+CR字符置換成LF字符。
複製代碼
unzip
-d <路徑> 指定解壓路徑
-n 解壓縮時不覆蓋原有文件
-f 覆蓋原有文件
-o 不經詢問,直接覆蓋原有文件
-u 覆蓋原有文件,並將壓縮文件中的其餘文件解壓縮到目錄中
-l 顯示壓縮文件內所包含的文件
-t 檢查壓縮文件是否正確
-z 顯示壓縮包註釋
-Z unzip -Z等於執行zipinfo指令
-j 不處理壓縮文件中原有的目錄路徑
-C 壓縮文件中的文件名稱區分大小寫
-L 將壓縮文件中的所有文件名改成小寫
-s 將文件名中的空格轉換下劃線
-X 解壓縮時保留文件原來的UID/GID
-q 執行時不顯示任何信息
-v 執行是時顯示詳細的信息
-c 將解壓縮的結果顯示到屏幕上,並對字符作適當的轉換
-p 與-c參數相似,會將解壓縮的結果顯示到屏幕上,但不會執行任何的轉換
-a 對文本文件進行必要的字符轉換
-b 不要對文本文件進行字符轉換
-x <表達式> 處理裏排除壓縮包中的指定文件
-M 將輸出結果送到more程序處理
複製代碼