作為壓縮解壓方面的擴充套件學習,兩大王牌壓縮格式 rar 和 zip 一直是計算機領域的壓縮終結者。rar 格式的壓縮包是 windows 系統中有接近統治地位的存在,今天我們學習的 php 擴充套件就是針對於 rar 的壓縮包操作,不過,php 的 rar 擴充套件僅能讀取和解壓 rar 格式的壓縮包,並不能進行壓縮操作。
php-rar 擴充套件在 pecl 的安裝包已經過時了,無法在 php7 中使用,我們需要使用它在 github 上的原始碼進行編譯安裝才能夠在 php7 的環境下安裝成功。
直接 git clone 之後就可以按正常的 php 擴充套件的方式進行安裝。
$arch = rararchive::open("test.rar");
$archno = rar_open("test.rar");
echo $arch, php_eol; // rar archive "/data/www/blog/test.rar"
echo $archno, php_eol; // rar archive "/data/www/blog/test.rar"
$arch->close();
rar_close($archno);
echo $arch, php_eol; // rar archive "/data/www/blog/test.rar" (closed)
echo $archno, php_eol; // rar archive "/data/www/blog/test.rar" (closed)
php-rar 擴充套件有兩種形式的寫法,一種是物件導向的,也就是使用 rararchive 類來操作壓縮包。另一種方式就是直接使用乙個函式 rar_open 用來獲取乙個 rar 檔案的控制代碼。它們都重寫了 __tostring 方法,所以我們可以直接列印控制代碼的內容看到當前控制代碼所操作的具體檔案。
當我們關閉控制代碼時,控制代碼物件依然能夠進行輸出,但後面會顯示乙個 closed 。這時的控制代碼物件已經不能進行其它操作了。
$arch = rararchive::open("test.rar");
$archno = rar_open("test.rar");
echo $arch->getcomment(), php_eol;
echo $arch->isbroken(), php_eol;
echo $arch->issolid(), php_eol;
echo rar_comment_get($archno), php_eol;
echo rar_broken_is($archno), php_eol;
echo rar_solid_is($archno), php_eol;
echo $arch->setallowbroken(true), php_eol;
echo rar_allow_broken_set($archno, true), php_eol;
rararchive 物件的一些方法可以幫我們獲取當前壓縮包的資訊。比如 getcomment() 獲取壓縮包的說明資訊,isbroken() 獲取當前壓縮包是否有損壞,issolid() 檢查當前壓縮包是否可用。而 setallowbroken() 方法是讓我們允許對損壞的壓縮包進行操作。這裡我們給出了物件導向和面向過程的寫法。
獲得壓縮包的控制代碼之後,我們就需要更進一步地獲取壓縮包內部的內容。而控制代碼物件中就已經儲存了壓縮包內部的各個檔案和目錄的物件 rarentry 。
$gameentry = $arch->getentry('ldxlcs/ldxlcs/game.htm');
echo $gameentry->getname(), php_eol; // ldxlcs/ldxlcs/game.htm
echo $gameentry->getunpackedsize(), php_eol; // 56063
$gameentryno = rar_entry_get($arch, "ldxlcs/ldxlcs/game.htm");
echo $gameentry->getname(), php_eol; // ldxlcs/ldxlcs/game.htm
echo $gameentry->getunpackedsize(), php_eol; // 56063
$fp = $gameentryno->getstream();
while (!feof($fp)) else
//fread error
}// 輸出檔案的全部內容
echo php_eol;
echo 'entry extract: ', $gameentry->extract("./"), php_eol;
控制代碼物件的 getentry() 方法就是用於獲取指定的檔案或者目錄內容的。它獲取的是單個檔案或目錄,所以必須明確地指定需要獲取的檔案內容。通過這個方法,我們可以拿到乙個 rarentry 物件。接下來,就是這個物件的一些操作。
rarentry 物件的 getname() 方法用於獲取檔名稱,這個檔名稱是帶路徑的,這個路徑是壓縮包內的絕對路徑。getunpackedsize() 方法用於獲取檔案的大小,getstream() 用於獲取檔案流,通過 getstream() 方法,我們就可以直接列印輸出檔案的內容。
當然,最最重要的是,我們可以通過 extract() 方法來直接解壓乙個檔案到指定的目錄。php-rar 擴充套件並沒有提供乙個能夠完全地解壓整個壓縮包的方法,所以如果我們需要對整個壓縮包進行解壓的話,就需要通過迴圈遍歷壓縮包內部的全部內容來對這些檔案乙個乙個地進行解壓。
最後,我們就來看看如何遍歷壓縮包內的全部內容。
$entries = $arch->getentries();
foreach ($entries as $en)
// 壓縮包中所有檔案的內容
// rarentry for file "ldxlcs/ldxlcs/game.htm" (3c19abf6)
// ldxlcs/ldxlcs/game.htm
// 56063
// 32
// 3c19abf6
// 2017-09-10 13:25:04
// 2
// 51
// 7049
// 200
// ……
$entriesno = rar_list($archno);
foreach ($entriesno as $en)
直接使用的是 rararchive 物件的 getentries() 方法,我們通過這個方法可以獲得乙個 rarentry 物件的陣列,裡面包含的就是這個 rar 壓縮包裡面的全部內容。在這段**中,我們還列印了 rarentry 物件的其它一些屬性方法,根據名稱也能大概了解這些方法都是獲取關於檔案的各種資訊的,大家可以自行測試。
最後,如果開啟錯了檔案或者獲取壓縮包內部沒有的檔案時,php-rar 擴充套件會以 php 錯誤的形式報錯。但既然提供了完整的物件導向寫法,那麼它也必然提供了一套物件導向的異常處理機制。
// 不開啟 usingexceptions 全部錯誤會走 php 錯誤機制,開啟後走 php 的異常機制
rarexception::setusingexceptions(true);
var_dump(rarexception::isusingexceptions()); // bool(true)
try catch (rarexception $e)
// }
// }
// ["previous":"exception":private]=>
// null
// }
}
只要將 rarexception::setusingexceptions() 設定為 true ,就能夠開啟 php-rar 擴充套件的異常處理機制,這時,我們開啟乙個錯誤的檔案,或者去獲取壓縮包內的乙個錯誤檔案路徑,那麼,錯誤資訊就會以異常的形式進行丟擲。
這套擴充套件是不是感覺很人性化?即提供了物件導向的方式,也提供了以函式操作為主的面向過程的方式。但是,這樣做其實並沒有太多的好處,因為又要兼顧老**,又要兼顧新思想,本身擴充套件的內部實現相必也會複雜很多。我們自己寫**的時候就盡量不要這麼寫了,在重構的時候一步步的向最新的形式遷移即可。
關於 rar 的壓縮操作並沒有找到太多有用的資料。當然,我們在生產環境中如果要生成壓縮包的話大部分情況下都會直接去生成 zip 格式的提供給使用者,畢竟大部分的客戶端軟體都是能夠同時支援 rar 和 zip 格式檔案的解壓的,如果一定要指定生成 rar 的話,也可以多多和產品經理或者客戶商量。有的時候,技術的難點是可以通過業務的變通來解決的,最重要的其實還是在於溝通。
測試**:
php實現rar檔案的讀取和解壓
php rar archiving 模組 php rar 是乙個讀取和解壓rar檔案的模組,但不提供rar壓縮 打包 的功能。3.在php.ini中加入一行php rar擴充套件引用宣告 extension php rar.dll 4.如果使用apache伺服器,就需要重啟apache。iis下以f...
PHP上傳RAR壓縮包並解壓目錄
一 php上傳並解壓的原理 普通上傳功能 上傳到伺服器 載入系統元件 執行解壓命令 成功解壓到目錄 其中載入的系統元件是rar zip等 二 php執行系統命令的幾類函式及區別 php中三個呼叫系統命令的函式system exec passthru 比較 system 輸出並返回最後一行shell結...
解壓rar Linux下rar壓縮包的解壓方法
linux本身不支援unrar和rar命令,需要我們安裝rar for linux root localhost wget 2 安裝 root localhost tar xf rarlinux x64 5.9.0.tar.gz root localhost cd rar root localhos...