2024 年 PHP Conference Japan

Phar::mount

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::mount將外部路徑或檔案掛載到 phar 封存內的虛擬位置

說明

final public static Phar::mount(字串 $pharPath, 字串 $externalPath): void

如同 Unix 檔案系統將外部裝置掛載到目錄樹路徑的概念,Phar::mount() 允許參照外部檔案和目錄,如同它們位於封存檔內。這允許強大的抽象化,例如參照外部設定檔,如同它們在封存檔內一樣。

參數

pharPath

用作掛載路徑位置的 phar 封存檔內的內部路徑。這必須是 phar 封存檔內的相對路徑,且不得已存在。

externalPath

要掛載到 phar 封存檔內的外部檔案或目錄的路徑或 URL。

傳回值

無傳回值。失敗時會拋出 PharException

錯誤/例外

如果掛載路徑時發生任何問題,則會拋出 PharException

範例

範例 #1 Phar::mount() 範例

以下範例顯示如何存取外部設定檔,如同它是 phar 封存檔內的路徑一樣。

首先,phar 封存檔內的程式碼

<?php
$configuration
= simplexml_load_string(file_get_contents(
Phar::running(false) . '/config.xml'));
?>

接下來是用於掛載設定檔的外部程式碼

<?php
// 首先設定抽象 config.xml
// 與磁碟上實際檔案之間的關聯
Phar::mount('phar://config.xml', '/home/example/config.xml');
// 現在執行應用程式
include '/path/to/archive.phar';
?>

另一種方法是將掛載程式碼放入 phar 封存檔的 stub 中。以下是在未指定使用者設定檔時設定預設設定檔的範例

<?php
// 首先設定抽象 config.xml
// 與磁碟上實際檔案的關聯
if (defined('EXTERNAL_CONFIG')) {
Phar::mount('config.xml', EXTERNAL_CONFIG);
if (
file_exists(__DIR__ . '/extra_config.xml')) {
Phar::mount('extra.xml', __DIR__ . '/extra_config.xml');
}
} else {
Phar::mount('config.xml', 'phar://' . __FILE__ . '/default_config.xml');
Phar::mount('extra.xml', 'phar://' . __FILE__ . '/default_extra.xml');
}
// 現在執行應用程式
include 'phar://' . __FILE__ . '/index.php';
__HALT_COMPILER();
?>

...以及用於載入此 phar 封存的外部程式碼

<?php
define
('EXTERNAL_CONFIG', '/home/example/config.xml');
// 現在執行應用程式
include '/path/to/archive.phar';
?>

新增註解

使用者貢獻的註解 1 則註解

espendiller at gmx dot de
14 年前
我測試了 phar 來產生一個單一檔案的 Drupal 安裝程式。
如同每個 CMS,Drupal 將所有上傳的檔案放在一個單獨的資料夾中(例如 /sites)。

我認為這裡的掛載選項預期是一個檔案,我無法讓它掛載一個資料夾。有什麼方法可以做到嗎?

使用 sqlite 資料庫從 drupal7 產生 phar

build.php
$phar = new Phar('drupal7.phar');
$phar->buildFromDirectory(dirname(__FILE__) . '/drupal-7.0-alpha5');
$phar->setStub("<?php
Phar
::interceptFileFuncs();
Phar::mount('sites/default/settings.php', __DIR__ . '/sites/default/settings.php');
Phar::mount('database.db', __DIR__ . '/database.db');
Phar::webPhar();
__HALT_COMPILER();
?>");
);

我使用 .htacces 檔案來呼叫 phar
RewriteCond %{REQUEST_URI} !^/drupal.phar/
RewriteCond %{REQUEST_URI} !build.php
RewriteRule ^(.*)$ /drupal.phar/$1
To Top