PHP的zlib壓縮工具擴充包學習
總算到了我們壓縮相關擴充的最後一篇文章了,最後我們要學習的也是 Linux 下非常常用的一種壓縮格式:.gz 的壓縮擴充。作為 PHP 的自帶擴充,就像 zip 一樣,zlib 擴充是随着 PHP 的安裝包一起釋出的,是以我們在編譯的時候直接加上 --with-zlib 就可以了,如果無法找到對應的軟體包的話,使用 yum 安裝相應的軟體包即可。
建立壓縮包
// 建立壓縮包
壓縮包的建立非常地簡單,不過 PHP 的這個擴充中,隻能使用 gzwrite() 來建立這種字元串類型的壓縮包,無法直接将某些目錄或者檔案進行打包。
建立壓縮包成功後,我們就可以通過系統的 tar 指令來解壓或者檢視檔案了。
讀取壓縮包内容
// 讀取壓縮包
讀取操作其實也非常簡單,直接使用 gzpassthru() 就可以輸出目前壓縮包裡面的内容,并且是直接列印出來。當然,它也是以類似于檔案指針的形式進行輸出的,是以如果我們輸出過一次之後,就必須要使用 gzrewind() 将指針的遊标還原到句柄最開始的位置。
對于 zlib 的壓縮包來說,我們還有很多其它的方式可以進行檔案内容的讀取。
// 讀取壓縮包二
這裡一口氣就提供了三種讀取的方式。首先當然還是我們最熟悉的檔案操作形式的讀取,使用的是 zlib 為我們提供的 gzeof() 和 gzgetc() 函數。除了 gzgetc() 之外,也提供了包括 gzgets() 和 gzgetss() ,分别是按行和按 HTML 格式行的讀取。其次,我們可以使用 readgzfile() 來直接讀取整個壓縮檔案的内容,連 gzopen() 都可以省了,與它類似的是 gzfile() 函數,這個函數與 readgzfile() 的差別就是它讀取的内容是以數組形式傳回的,對于多檔案的壓縮包更有用。
gzip 壓縮類型
既然 zlib 所壓縮的格式是 .gz 類型,而且還隻能做字元串形式的壓縮,那麼不少小夥伴肯定有疑問了,它和 gzip 有什麼關系呢?其實,zlib 除了是可以做為壓縮打包工具之外,也可以做為 gzip 工具應用到我們的伺服器中。當然,現在大多數情況下我們隻需要開啟 Nginx 或者 Apache 的 gzip 壓縮功能就可以了,不需要我們再到 PHP 中進行處理了。不過做為一名合格的 PHP 程式員,相關的操作函數我們還是需要學習的,說不定哪天就用上了呢。
// 壓縮類型及相關操作
其實注釋中已經寫得很清晰了,不止是 PHP ,Nginx 也是會提供這三種編碼格式的,而且我們從浏覽器中就可以看出目前通路的網站使用的是哪種壓縮編碼格式。比如我們通路 PHP 的官方網站所傳回的内容:
從性能的次元看:deflate 好于 gzip 好于 zlib,而從文本檔案預設壓縮率壓縮後體積的次元看:deflate 好于 zlib 好于 gzip 。也就是說,deflate 格式不管在性能還是壓縮率來說都是現在比較好的選擇。當然,這樣好的格式對于 CPU 的硬體性能的影響就不清楚了,畢竟我們沒有大型的功能頁面來進行測試,起碼對于普通的網站頁面來說,已經綽綽有餘了。
另外,就像其它的壓縮工具一樣,能夠對于字元串進行編碼的工具我們都可以擴充一個應用場景,那就是資料的加密能力,這個在前面 Bzip2 、 LZF 相關的這些文章已經說過了,就不再多說了。
最後,我們還有一個通用的函數通過預定義的常量直接可以操作這三種類型的編碼及解碼。
// 通用壓縮函數
zlib_encode() 函數的第二個參數就是需要指定一個編碼的類型,這裡 zlib 擴充已經為我們準備好了 ZLIB_ENCODING_RAW 、 ZLIB_ENCODING_DEFLATE 、 ZLIB_ENCODING_GZIP 這三個類型的常量。而解壓 zlib_decode() 則不需要再進行指定了,它會直接根據檔案頭自動選擇相應的編碼格式對内容進行解碼。
增量壓縮操作函數
在 PHP7 中,zlib 擴充為我們增加一種可以增量壓縮編碼的操作函數,就是可以在不使用對象句柄的情況下,使用函數直接增加内容。
// PHP7 新增的增量壓縮操作函數
就像例子中展示的那樣,deflate_add() 用于增量的添加内容到編碼檔案中,當标志為 ZLIB_FINISH 時結束操作的寫入。deflate_init() 和 inflate_init() 分别是編碼和反編碼對應的初始化操作。
總結
關于壓縮解壓相關的擴充我們已經介紹了 Bzip2 、 LZF 、 Phar 、 rar 、 zip 和 zlib 這些官方的擴充,在實際的生産中我們其實會比較常用到的是 zip 和 zlib ,當然,對于其它的格式也有了一定的學習了解,剩下的就是我們自己在用到的時候再次的深度研究了。這一個系列的内容讓我對這些壓縮格式也有了更一步的了解,希望大家也能從中獲益。
測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84zlib%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.zlib.php
https://www.php.cn/php-weizijiaocheng-377246.html