搜尋
首頁後端開發php教程PHP開發之歸檔格式phar檔概念與用法

PHP開發之歸檔格式phar檔概念與用法

Jan 02, 2018 am 11:25 AM
pharphp文件

一個php應用程式往往是由多個檔案構成的,如果能把他們集中為一個檔案來分發和運行是很方便的,這樣的列子有很多,例如在window作業系統上面的安裝程式、一個jquery函式庫等等,為了做到這點php採用了phar文件檔格式,這個概念源自java的jar,但在設計時主要針對 PHP 的 Web 環境,與 JAR 歸檔不同的是Phar 歸檔可由 PHP 本身處理,因此不需要使用額外的工具來創建或使用,使用php腳本就能創建或提取它。 phar是一個合成詞,由PHP 和 Archive構成,可以看出它是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內容如下:

nbsp;html>


  <meta>
  <title>phar</title>


=$str; ?>

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(&#39;yunke.phar&#39;, 0, &#39;yunke.phar&#39;);
// 添加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歸檔檔案的使用:

我們在伺服器根目錄建立一個index.php檔案來示範如何使用上面建立的phar文件,內容如下:

<?php /**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/8
 * Time: 9:33
 */
require "yunke.phar";
require "phar://yunke.phar/Lib.php";
yunke();

如果index.php檔案中只有第一行,那麼和不使用歸檔檔案時,加入如下程式碼完全相同:

require "project/index.php";

如果沒有第二行,那麼第三行的yunke()將提示未定義,所以可見require一個phar檔案時並不是導入了裡面所有的文件,而只是導入了入口執行文件而已,但在實際專案中往往在這個入口文件裡匯入其他需要使用的文件,在本例中入口執行文件為project/index.php

# phar檔案的提取還原:

我們有時候會好奇phar裡麵包含的檔案原始碼,這時候就需要將phar檔案還原,如果只是看一看的話可以使用一些ide工具,例如phpstorm 10就能直接打開它,如果需要修改那麼就需要提取操作了,為了演示,我們下載一個composer.phar放在伺服器目錄,在根目錄建立一個get.php文件,內容如下:

<?php /**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/9
 * Time: 19:02
 */
$phar = new Phar(&#39;composer.phar&#39;);
$phar->extractTo('composer'); //提取一份原项目文件
$phar->convertToData(Phar::ZIP); //另外再提取一份,和上行二选一即可

用瀏覽器存取這個文件,即可提取出來,以上列子展示了兩種提取方式:第二行將建立一個composer目錄,並將提取出來的內容放入,第三行將產生一個composer.zip文件,解壓即可得到提取還原的項目檔。

補充:

1.部署phar檔案到生產伺服器時需要調整伺服器的配置,避免當訪問時瀏覽器直接下載phar檔案

2、可以為歸檔設定別名,別名保存在歸檔檔案中永久保存,它可以用一個簡短的名字引用歸檔,而不管歸檔檔案在檔案系統中儲存在那裡,設定別名:

$phar = new Phar('lib/yunke.phar', 0);
$phar->setAlias ( "yun.phar");

設定別名後可以如下使用:

<?php require "lib/yunke.phar";
require "phar://yun.phar/Lib.php"; //使用别名访问归档文件
require "phar://lib/yunke.phar/Lib.php"; //当然仍然可以使用这样的方式去引用

如果在製作phar檔案時沒有指定別名,也可以在存根檔案裡面使用Phar::mapPhar('yunke.phar');指定

3.歸檔文件中有一個存根文件,其實就是一段php執行程式碼,在製作歸檔時可以設置,直接執行歸檔文件時,其實就是執行它,所以它是啟動文件;在腳本中包含歸檔文件時就像包含普通php檔案一樣包含它並且執行,但直接以phar://的方式包含檔案中某一個檔案時不會執行存根程式碼, 往往在存根文件裡面require包含要運行的其他文件,對存根文件的限制僅為以__HALT_COMPILER();結束,默認的存根設計是為在沒有phar擴展時能夠運行,它提取phar文件內容到一個臨時目錄再執行,不過從php5.3開始該擴充預設內建啟用了

# 4.製作的phar檔案不能被改動,因此設定檔之類的檔案需要另外放置在歸檔檔案外面

5.mapPhar函數:這個函數只應該在stub存根程式碼中調用,在沒有設定歸檔別名的時候可以用來設定別名,打開一個引用映射到phar流。

相關推薦:

PHP開發之歸檔格式phar如何使用

phar套件的使用方法PHP

php 中phar套件的使用教學詳解

以上是PHP開發之歸檔格式phar檔概念與用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!