phar 擴充功能提供了一種將整個 PHP 應用程式放入名為「phar」(PHP Archive)的單一檔案中的方式,以便於分發和安裝。除了提供此服務外,phar 擴充功能還提供了一種檔案格式抽象方法,用於透過 PharData 類別建立和操作 tar 和 zip 檔案,就像 PDO 提供用於存取不同資料庫的統一介面一樣。與無法在不同資料庫之間轉換的 PDO 不同,Phar 還可以透過單行程式碼在 tar、zip 和 phar 檔案格式之間轉換。請參閱 Phar::convertToExecutable() 以取得範例。
什麼是 phar? Phar 封存檔最適合被描述為一種將多個檔案分組到單一檔案中的便捷方式。因此,phar 封存檔提供了一種在單一檔案中分發完整的 PHP 應用程式並從該檔案執行它的方法,而無需將其解壓縮到磁碟。此外,phar 封存檔可以像任何其他檔案一樣輕鬆地由 PHP 執行,無論是在命令列還是在網路伺服器上。Phar 有點像 PHP 應用程式的隨身碟。
Phar 透過 串流包裝器 實作此功能。通常,要在 PHP 腳本中使用外部檔案,您會使用 include
範例 #1 使用外部檔案
<?php
include '/path/to/external/file.php';
?>
可以認為 PHP 實際上將 /path/to/external/file.php
轉換為串流包裝器,例如 file:///path/to/external/file.php
,並且實際上在幕後使用純文字檔案串流包裝器串流函式來存取所有本機檔案。
若要使用 phar 封存檔 /path/to/myphar.phar
中包含的檔案 file.php
,其語法與上面的 file://
語法非常相似。
範例 #2 使用 phar 封存檔內的檔案
<?php
include 'phar:///path/to/myphar.phar/file.php';
?>
事實上,可以使用任何與 fopen() 相關的函式、opendir() 和 mkdir() 相關的函式來讀取、變更或在 phar 封存檔中建立新的檔案和目錄,將 phar 封存檔視為外部磁碟。這允許在單一檔案中分發完整的 PHP 應用程式並直接從該檔案執行。
phar 封存檔最常見的用途是在單一檔案中分發完整的應用程式。例如,與 PHP 版本捆綁在一起的 PEAR 安裝程式是作為 phar 封存檔分發的。若要使用以這種方式分發的 phar 封存檔,可以在命令列或透過網路伺服器執行封存檔。
Phar 封存檔可以作為 tar
封存檔、zip
封存檔或專為 phar 擴充功能設計的自訂 phar
檔案格式分發。每種檔案格式都有其優缺點。tar 和 zip 檔案格式可以由任何可以讀取該格式的協力廠商工具讀取或解壓縮,但需要 phar 擴充功能才能使用 PHP 執行。phar 檔案格式是為 phar 擴充功能自訂和獨有的,只能由 phar 擴充功能或 PEAR 套件 » PHP_Archive 建立,但其優點是,即使未啟用 phar 擴充功能,以這種格式建立的應用程式也可以執行。
換句話說,即使停用了 phar 擴充功能,也可以執行或包含基於 phar 的封存檔。除非 phar 封存檔是由 PHP_Archive 建立的,否則只有在安裝 phar 擴充功能的情況下才能存取 phar 封存檔中的個別檔案。
phar 擴充功能還能夠透過單一指令將 phar 封存檔從 tar 轉換為 zip 或 phar 檔案格式。
範例 #3 將 phar 封存檔從 phar 轉換為 tar 檔案格式
<?php
$phar = new Phar('myphar.phar');
$pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // 產生 myphar.phar.tar.gz
?>
Phar 可以使用 gzip 壓縮或 bzip2 壓縮來壓縮個別檔案或整個封存檔,並且可以透過使用 MD5、SHA-1、SHA-256 或 SHA-512 簽章自動驗證封存檔的完整性。
最後,Phar 擴充功能具有安全性意識,預設情況下會停用對可執行 phar 封存檔的寫入存取,並且需要停用系統級的 phar.readonly
php.ini 設定才能建立或修改 phar 封存檔。可以使用 PharData 類別隨時建立或修改沒有可執行存根的普通 tar 和 zip 封存檔。
如果您要建立用於分發的應用程式,您會想要閱讀如何建立 Phar 封存檔。如果您想要瞭解更多關於 phar 支援的三種檔案格式之間差異的資訊,您應該閱讀Phar、Tar 和 Zip。
如果您正在使用 phar 應用程式,如何使用 Phar 封存檔中提供了一些實用的提示。
「phar
」這個詞是 PHP
和 Archive
的混成詞,其基礎大致上是 Java 開發人員熟悉的 jar
(Java Archive)。
Phar 封存檔的實作基於 PEAR 套件 » PHP_Archive,並且實作細節類似,儘管 Phar 擴充功能的功能強大得多。此外,Phar 擴充功能允許大多數 PHP 應用程式在未修改的情況下執行,而基於 PHP_Archive 的 phar 封存檔通常需要進行大量修改才能正常工作。