站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        php如何使用Phar代碼打包工具

        本篇文章給大家介紹一下php使用Phar代碼打包工具的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

        php如何使用Phar代碼打包工具

        簡單了解Phar代碼打包工具的使用

        Phar 是在 PHP5 之后提供的一種類似于將代碼打包的工具。本質(zhì)上是想依照 Java 的 Jar 文件那種形式的代碼包,不過本身由于 PHP 是不編譯的,所以這個 Phar 實際上就是將代碼原樣的進(jìn)行打包,不會進(jìn)行編譯。但是我們可以對打包的 Phar 包進(jìn)行壓縮操作。

        另外,實際上使用過 Phar 包的人非常少,特別是在 Composer 已經(jīng)成為事實代碼庫標(biāo)準(zhǔn)的今天,Phar 就更加難覓蹤影了。不過,Composer 的安裝包本身也是一個 .phar 的打包文件。

        最主要的原因,一個是 Phar 這種形式的代碼包安裝并不像 Composer 一樣的簡單方便,另一方面,早期的程序員,特別是 LAMP/LAMP 的程序員,都喜歡去將開源的代碼復(fù)制過來,而不喜歡直接使用一個工具包。

        畢竟,源代碼在手上讓我們更加踏實一些。其實,就算是 Composer 這樣直接下載的就是源碼,我們也從來沒什么人真正的去翻過。而 Composer 相比 Phar 的最大優(yōu)勢,一個是代碼的自動加載,另一個就是標(biāo)準(zhǔn)的 PSR 命令空間和目錄規(guī)范。這兩個在 Phar 中是沒有的,所以我們要使用 Phar 包都必須要 require 一下。

        雖說已經(jīng)過時了,但我們還是簡單的來學(xué)習(xí)了解一下。說不定在什么時候我們就能用上,特別是封裝一些內(nèi)部的公用庫函數(shù)時,Phar 打包代碼的這種方式還是非常有用的。

        代碼打包

        我們先按標(biāo)準(zhǔn)格式建立一個目錄樹。

        php如何使用Phar代碼打包工具

        在這個目錄樹中,src 目錄存放源碼,build 目錄用來存放生成后的 .phar 代碼包。

        // index.php <?php  require_once "phar://myphar.phar/common.php";

        index.php 文件中,我們就是簡單的引用 common.php 。注意這里使用的是 phar 偽協(xié)議來加載的 common.php 文件。關(guān)于偽協(xié)議的內(nèi)容我們之前有過一篇文章進(jìn)行過講解。

        <?php // common.php class Manager{      public static function run($config){         echo "AAA", PHP_EOL;         var_dump($config);     }      public static function ChineseMobile($mobile){         if(preg_match("/^1[34578]d{9}$/", $mobile)){             return true;         }         return false;     } }

        common.php 文件中只是提供了一個類和兩個簡單的方法用來測試。run() 方法就是簡單的輸出打印的內(nèi)容和傳遞過來的參數(shù)。ChineseMobile() 方法則是我們提供的一個判斷我們國內(nèi)手機(jī)號的函數(shù)。

        [database] host=localhost db=dbname user=myuser pass=dbpass

        config.ini 是一個配置文件,其實我們可以在 Phar 的代碼中直接的進(jìn)行配置文件的讀取,也可以讓配置文件隨代碼一起 build 到指定的目錄。

        源碼文件準(zhǔn)備好了,接下來就是要準(zhǔn)備打包的編譯文件了。

        // create-phar.php $srcRoot = "./myphar/src"; $buildRoot = "./myphar/build";   $phar = new Phar($buildRoot . "/myphar.phar",    FilesystemIterator::CURRENT_AS_FILEINFO |       FilesystemIterator::KEY_AS_FILENAME, "myphar.phar"); $phar["index.php"] = file_get_contents($srcRoot . "/index.php"); $phar["common.php"] = file_get_contents($srcRoot . "/common.php"); $phar->setStub($phar->createDefaultStub("index.php"));  copy($srcRoot . "/config.ini", $buildRoot . "/config.ini");

        代碼并不復(fù)雜,主要是一個 Phar 類,這個類要指定生成文件的目錄,文件名,然后使用 createDefaultStub() 方法來調(diào)用我們包的入口文件 index.php ,這個方法是用于創(chuàng)建指定的 .phar 文件的存根。其實就是指定一個入口文件,就像 Java 中的 main() 方法入口一樣。

        然后我們拷貝了 config.ini 文件到發(fā)布目錄 build 中。

        接著使用命令行運行這個 create-phar.php 文件,就能夠生成這套代碼包了。

        # php ./create-phar.php

        php如何使用Phar代碼打包工具

        使用文本編輯器打開 myphar.phar 文件,我們會發(fā)現(xiàn)里面竟然還是我們熟悉的 PHP 代碼,拉到最底下,更會發(fā)現(xiàn) index.php 和 common.php 的內(nèi)容都被編譯在這個文件中了。上面的那些自動生成的代碼就是一些引導(dǎo)或者前置準(zhǔn)備語句,是 Phar 擴(kuò)展為我們準(zhǔn)備好的內(nèi)容,所有用戶自己寫的源碼都會在這個文件的底部。也就是說,大家可以下載 Composer 的安裝包,也就是那個 .phar 文件看看里面都寫了什么東西。

        接下來就是使用了,這個就非常簡單了。

        $config = parse_ini_file("./myphar/build/config.ini"); require './myphar/build/myphar.phar';  Manager::run($config); // AAA // array(4) { //   ["host"]=> //   string(9) "localhost" //   ["db"]=> //   string(6) "dbname" //   ["user"]=> //   string(6) "myuser" //   ["pass"]=> //   string(6) "dbpass" // }  var_dump(Manager::ChineseMobile('13811111111')); var_dump(Manager::ChineseMobile('138111111112')); // bool(true) // bool(false)

        壓縮能力

        前面說過,做為代碼庫來說,Phar 已經(jīng)早就敗給了 Composer ,但是它除了能夠做為一些安裝包來使用之外,本身 Phar 也是一個壓縮工具??梢杂脕泶鏅n一些文件、文本、目錄之類的內(nèi)容。下面我就來簡單看看對于文本的存檔,Phar 是如何使用的。

        unlink('./my.phar'); unlink('./my.phar.bz2'); unlink('./my.phar.gz'); $p = new Phar('./my.phar', 0 ,'my.phar'); $p['myfile1.txt'] = 'hi1'; $p['myfile2.txt'] = 'hi2'; $p1 = $p->compress(Phar::GZ); $p2 = $p->compress(Phar::BZ2); unset($p);  $decompressPhar  = new Phar('./my.phar', 0 ,'my.phar'); foreach($decompressPhar as $file){     // $file 是返回的 PharFileInfo 對象     var_dump($file->getFileName());     var_dump($file->isCompressed());     var_dump($file->isCompressed(Phar::BZ2));     var_dump($file->isCompressed(Phar::GZ));     var_dump($file->getContent()); } echo '==================', PHP_EOL; // string(11) "myfile1.txt" // bool(false) // bool(false) // bool(false) // string(3) "hi1" // string(11) "myfile2.txt" // bool(false) // bool(false) // bool(false) // string(3) "hi2"

        首先,依然是實例化一個 Phar 類,然后我們給它像數(shù)組一樣增加屬性,這樣,屬性內(nèi)容就被打包進(jìn)了 .phar 文件中。通過直接查看 my.phar 文件,我們可以看出,myfile1.txt 這兩個屬性直接被寫成了文件進(jìn)行保存了,也就是說,它幫我們將文本轉(zhuǎn)化成文件并打包在了 my.phar 這個壓縮包文件中了。

        compress() 方法則是將當(dāng)前的這個 Phar 對象壓縮存儲為某個格式的文件。這里我們直接壓縮了 Bzip2 和 GZ 文件。調(diào)用這個方法后直接就會生成對應(yīng)的壓縮文件。

        Phar 對象在遍歷時產(chǎn)生的對象是 PharFileInfo 對象,它擁有很多類似于 File 的文件操作函數(shù)。大家可能在官方文檔中找到相關(guān)的說明。

        假設(shè)我們遍歷 my.phar.gz ,內(nèi)容依然可以正常輸出,但循環(huán)中的 isCompressed() 判斷都依然會是 false ,難道文件沒有被壓縮嗎?其實,我們需要通過另一個函數(shù)來讓所有文件都進(jìn)行統(tǒng)一格式的壓縮。

        $p = new Phar('./my.phar', 0 ,'my.phar'); $p->compressFiles(Phar::GZ); unset($p);  $decompressPhar  = new Phar('./my.phar.gz', 0 ,'my.phar'); foreach($decompressPhar as $file){     // $file 是返回的 PharFileInfo 對象     var_dump($file->getFileName());     var_dump($file->isCompressed());     var_dump($file->isCompressed(Phar::BZ2));     var_dump($file->isCompressed(Phar::GZ));     var_dump($file->getContent()); } echo '==================', PHP_EOL;  // string(11) "myfile1.txt" // bool(true) // bool(false) // bool(true) // string(3) "hi1" // string(11) "myfile2.txt" // bool(true) // bool(false) // bool(true) // string(3) "hi2"

        使用 compressFiles() 對整個 .phar 中的所有文件進(jìn)行了統(tǒng)一的格式壓縮之后,再打印時 isCompressed() 就會返回對應(yīng)格式的 true 了。

        數(shù)據(jù)格式 Phar

        最后,如果只是為了打包壓縮功能的話,我們沒必要使用 Phar 類。Phar 類最主要的還是用來打包能夠運行的 PHP 源碼,也就是它的 createDefaultStub() 方法非常重要。而如果只是打包普通文件的話,我們并不需要這個方法,這時,我們就可以使用另外一個 PharData 類來進(jìn)行數(shù)據(jù)的打包壓縮。使用方法和 Phar 類是一模一樣的。同時,PharData 類可以直接打包成 tar 之類的文件。

        $p = new PharData('./myData.tar'); $p['myfile1.txt'] = 'hi1'; $p['myfile2.txt'] = 'hi2';  foreach($p as $file){     var_dump($file->getFileName());     var_dump($file->isCompressed());     var_dump($file->isCompressed(Phar::BZ2));     var_dump($file->isCompressed(Phar::GZ));     var_dump($file->getContent()); } echo '==================', PHP_EOL; // string(11) "myfile1.txt" // bool(false) // bool(false) // bool(false) // string(3) "hi1" // string(11) "myfile2.txt" // bool(false) // bool(false) // bool(false) // string(3) "hi2"

        總結(jié)

        說實話,Phar 真的是一個冷門項目,但是在某些情況中又非常有用,比如它雖然在代碼包領(lǐng)域被 Composer 打敗了,但是它又可以成為 Composer 的安裝包,也就是說,沒有 Phar 你就安裝不了 Composer 。而做為壓縮工具,雖然有強大的實力但使用的卻也非常的少。因此,我們還是以了解為目的,如果感覺某些場景非常合適的話,也完全可以深入的研究拿來放到我們的實際項目中使用。畢竟它是 PHP 的一部分,不需要任何的編譯安裝及其它支持,非常原生。

        測試代碼:

        https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3Phar%E4%BB%A3%E7%A0%81%E6%89%93%E5%8C%85%E5%B7%A5%E5%85%B7%E7%9A%84%E4%BD%BF%E7%94%A8.php

        推薦學(xué)習(xí):php視頻教程

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产成人精品久久综合 | 色综合久久精品中文字幕首页| 欧美日韩国产精品系列| 日韩麻豆国产精品欧美| 国产精品嫩草影院AV| 亚洲国产成人a精品不卡在线| 国产91精品黄网在线观看| 国产精品福利一区二区久久| 精品亚洲成AV人在线观看| 野狼精品社区| 久热精品视频第一页| 2020最新久久久视精品爱| 国产精品污视频| 99久久人妻无码精品系列| 麻豆成人久久精品二区三区免费 | 人妻少妇精品视频一区二区三区| 四虎精品亚洲一区二区三区| 国产精品狼人久久久久影院 | 欧洲精品一区二区三区在线观看| 国产精品伦理久久久久久| 亚洲国产精品久久久久网站| 国产精品久久久久无码av | 热re99久久6国产精品免费| 亚洲午夜成人精品电影在线观看 | 国产精品福利一区二区| 精品久久久久久成人AV| 无码精品人妻一区二区三区中| 亚洲欧美日韩国产一区二区三区精品 | 久久精品无码一区二区三区日韩| 国产精品最新国产精品第十页| 囯产精品一区二区三区线| 99久久国产综合精品网成人影院| 欧美777精品久久久久网| 欧美精品国产一区二区| 五月花精品视频在线观看 | 久久夜色精品国产亚洲| 日韩精品一区二区三区四区 | 精品国产福利在线观看| 国产精品多p对白交换绿帽| 国产国产精品人在线观看| 2021精品国产综合久久|