PHP的bz2壓縮擴展工具
在平常的開發和電腦使用中,咱們常常會接觸到壓縮和解壓的一些工具,PHP 也爲咱們準備了不少相關的操做擴展包,都有直接可用的函數可以方便的操做一些壓縮解壓功能。今天,咱們先學習一個比較簡單但不太經常使用的壓縮格式:Bzip2。php
安裝擴展
這個擴展的安裝須要系統有 bzip2-devel 。因此咱們須要先給系統裝上這個軟件包的支持,而後這個擴展是隨 PHP 安裝包一塊兒發佈的,因此只須要編譯一下 PHP ,並在 ./configure 中添加對應的編譯命令便可。git
# yum install bzip2-devel
# ./configure xxxx --with-bz2
# make && make install
基本操做
Bzip2 提供的函數很少,並且很是簡單,咱們首先來看的是將字符串保存到一個文件中。github
$bz = bzopen('/tmp/test.bz', 'w');
// -rw-r--r-- 1 root root 14 Jun 28 09:51 test.bz
$text = "This is Bz Compress";
bzwrite($bz, $text);
// -rw-r--r-- 1 root root 59 Jun 28 09:53 test.bz
bzclose($bz);
$bz = bzopen('/tmp/test.bz', 'r');
$v = bzread($bz);
echo $v, PHP_EOL;
// This is Bz Compress
bzclose($bz);
就和文件操做函數同樣,咱們須要先經過 bzopen() 打開文件得到句柄。而後使用 bzwrite() 來寫入文件,並使用 bzread() 來讀取文件。最後使用 bzclose() 來關閉文件。web
這裏須要注意的是 bzopen() 的第二個參數,也就是文件打開的形式,只能寫 "w" 或者 "r" 。沒有其它類型,而且不能同時讀寫,也就是不能寫成 "wr" 這種形式。因此咱們在寫完文件後又要再使用 "r" 打開文件才能進行讀取。數組
讀取長度設置
$bz = bzopen('/tmp/test.bz', 'r');
$v = bzread($bz, 10);
echo $v, PHP_EOL;
// This is Bz
$v = bzread($bz);
echo $v, PHP_EOL;
// Compress
bzclose($bz);
bzread() 的第二個參數是可選的字節長度,默認是 1024 ,一次最大可讀入 8192 個未壓縮字節。微信
字符串編碼
Bzip2 擴展還爲咱們提供了直接對字符串編碼的函數。這樣咱們的壓縮內容就能夠不用每次都存入文件中,若是是相同的字符串,使用字符串編碼的函數和輸出到文件中的內容是同樣的亂碼的二進制內容。編輯器
$str = "Test compress String";
$bzstr = bzcompress($str, 9);
echo $bzstr, PHP_EOL;
// BZh91AY&SY��J���@
//
// �� 1
// df����2�h>.�p�!��//
$newStr = bzdecompress($bzstr);
echo $newStr, PHP_EOL;
$chineseStr = "測試";
$bzstr = bzcompress($chineseStr, 9);
echo bzdecompress($bzstr), PHP_EOL;
bzcompress() 用於將字符串進行編碼壓縮,第二個參數是壓縮的比率,9 爲最高等級。編碼後的內容是非人類的二進制亂碼內容。bzdecompress() 用於對已編碼的內容進行解碼。相信很多小夥伴已經發現了,這個能夠用來作一些保密內容的加密傳輸。同時,在測試代碼中,咱們能夠看到,它對中文也是正常支持的。函數
錯誤信息
最後,咱們來看一下 Bzip2 的錯誤處理函數。工具
$bz = bzopen('/tmp/test.bz', 'r');
bzwrite($bz, 'aaa');
print_r(bzerror($bz));
// Array
// (
// [errno] => -1
// [errstr] => SEQUENCE_ERROR
// )
echo bzerrno($bz), PHP_EOL; // -1
echo bzerrstr($bz), PHP_EOL; // SEQUENCE_ERROR
bzclose($bz);
咱們首先構造了一個錯誤環境。使用 "r" 打開文件得到句柄後,對這個文件進行寫入操做。bzerror() 會返回一個錯誤信息的數組,裏面包含了錯誤號和錯誤信息內容。而 bzerrno() 和 bzerrstr() 則是單獨地分別返回錯誤號和錯誤內容。三個很是簡單而且好理解的函數。學習
總結
這個擴展仍是很是簡單的,最主要的是 Bzip2 這種壓縮文件類型也並非很是經常使用的類型,因此可能知道的人並很少。可是咱們仍是從中發現了一絲絲的驚喜,就是它提供了字符串的編解碼函數,這樣的話,這兩個函數就能夠在某些場景下做爲信息加密的手段來使用。
測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/PHP%E7%9A%84Bzip2%E5%8E%8B%E7%BC%A9%E6%89%A9%E5%B1%95%E5%B7%A5%E5%85%B7.php
參考文檔:
https://www.php.net/manual/zh/book.bzip2.php
本文分享自微信公衆號 - 硬核項目經理(fullstackpm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。