本文實例講述了PHP開發(fā)之歸檔格式phar文件概念與用法。分享給大家供大家參考,具體如下:
一個php應(yīng)用程序往往是由多個文件構(gòu)成的,如果能把他們集中為一個文件來分發(fā)和運行是很方便的,這樣的列子有很多,比如在window操作系統(tǒng)上面的安裝程序、一個jquery庫等等,為了做到這點php采用了phar文檔文件格式,這個概念源自java的jar,但是在設(shè)計時主要針對 PHP 的 Web 環(huán)境,與 JAR 歸檔不同的是Phar 歸檔可由 PHP 本身處理,因此不需要使用額外的工具來創(chuàng)建或使用,使用php腳本就能創(chuàng)建或提取它。phar是一個合成詞,由PHP 和 Archive構(gòu)成,可以看出它是php歸檔文件的意思。
關(guān)于phar的官網(wǎng)文檔請見http://php.net/manual/zh/book.phar.php,本文檔可以看做和官網(wǎng)文檔互為補充
phar歸檔文件有三種格式:tar歸檔、zip歸檔、phar歸檔,前兩種執(zhí)行需要php安裝Phar 擴展支持,用的也比較少,這里主要講phar歸檔格式。
phar格式歸檔文件可以直接執(zhí)行,它的產(chǎn)生依賴于Phar擴展,由自己編寫的php腳本產(chǎn)生。
Phar 擴展對 PHP 來說并不是一個新鮮的概念,在php5.3已經(jīng)內(nèi)建于php中,它最初使用 PHP 編寫并被命名為 PHP_Archive,然后在 2005 年被添加到 PEAR 庫。由于在實際中,解決這一問題的純 PHP 解決方案非常緩慢,因此 2007 年重新編寫為純 C 語言擴展,同時添加了使用 SPL 的 ArrayAccess 對象遍歷 Phar 歸檔的支持。自那時起,人們做了大量工作來改善 Phar 歸檔的性能。
Phar 擴展依賴于php流包裝器,關(guān)于此可參考前面一篇文章PHP流Streams、包裝器wrapper概念與用法實例詳解
很多php應(yīng)用都是以phar格式分發(fā)并運行的,著名的有依賴管理:composer、單元測試:phpunit,下面我們來看一看如何創(chuàng)建、運行、提取還原。
phar文件的創(chuàng)建:
首先在php.ini中修改phar.readonly這個選項,去掉前面的分號,并改值為off,由于安全原因該選項默認是on,如果在php.ini中是禁用的(值為0或off),那么在用戶腳本中可以開啟或關(guān)閉,如果在php.ini中是開啟的,那么用戶腳本是無法關(guān)閉的,所以這里設(shè)置為off來展示示例。
我們來建立一個項目,在服務(wù)器根目錄中建立項目文件夾為project,目錄內(nèi)的結(jié)構(gòu)如下:
file -yunek.js -yunke.css lib -lib_a.php template -msg.html index.php Lib.php
其中file文件夾有兩個內(nèi)容為空的js和css文件,僅僅演示phar可以包含多種文件格式
lib_a.php內(nèi)容如下:
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/10 * Time: 9:23 */ function show(){ echo "l am show()"; }
msg.html內(nèi)容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>phar</title> </head> <body> <?=$str; ?> </body> </html>
index.php內(nèi)容如下:
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/10 * Time: 9:17 */ require "lib/lib_a.php"; show(); $str = isset($_GET["str"]) ? $_GET["str"] : "hello world"; include "template/msg.html";
Lib.php內(nèi)容如下:
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/10 * Time: 9:20 */ function yunke() { echo "l am yunke()"; }
項目文件準備好了,開始創(chuàng)建,現(xiàn)在在project文件夾同級目錄建立一個yunkeBuild.php,用于產(chǎn)生phar格式文件,內(nèi)容如下:
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/10 * Time: 9:36 */ //產(chǎn)生一個yunke.phar文件 $phar = new Phar('yunke.phar', 0, 'yunke.phar'); // 添加project里面的所有文件到y(tǒng)unke.phar歸檔文件 $phar->buildFromDirectory(dirname(__FILE__) . '/project'); //設(shè)置執(zhí)行時的入口文件,第一個用于命令行,第二個用于瀏覽器訪問,這里都設(shè)置為index.php $phar->setDefaultStub('index.php', 'index.php');
然后在瀏覽器中訪問這個yunkeBuild.php文件,將產(chǎn)生一個yunke.phar文件,此時服務(wù)器根目錄結(jié)構(gòu)如下:
project yunkeBuild.php yunke.phar
這就是產(chǎn)生一個phar歸檔文件最簡單的過程了,更多內(nèi)容請看官網(wǎng),這里需要注意的是如果項目不具備單一執(zhí)行入口則不宜使用phar歸檔文件
phar歸檔文件的使用: