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