安裝擴充功能
這個擴充的安裝需要係統有 bzip2-devel 。所以我們需要先給系統安裝這個軟體包的支持,然後這個擴充功能是隨 PHP 安裝套件一起發布的,所以只需要編譯 PHP ,並在 ./configure 中加入對應的編譯指令。
# yum install bzip2-devel # ./configure xxxx --with-bz2 # make && make install
基本操作
Bzip2 提供的函數不多,而且非常簡單,我們首先來看的是將字串儲存到一個檔案中。
$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() 來關閉檔案。
這裡要注意的是 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
推薦學習:php影片教學