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