PHP Conference Japan 2024

Phar::mount

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

Phar::mount将外部路径或文件挂载到 phar 归档文件中的虚拟位置

描述

final public static Phar::mount(string $pharPath, string $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 归档文件的存根中。以下是如何在未指定用户配置的情况下设置默认配置文件的示例

<?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)。

我认为这里的 mount 选项期望一个文件,我无法让它在挂载文件夹上工作。是否有可能做到这一点?

从 Drupal7 生成一个带 SQLite 数据库的 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();
?>"
);

使用 .htaccess 文件调用 Phar 归档
RewriteCond %{REQUEST_URI} !^/drupal.phar/
RewriteCond %{REQUEST_URI} !build.php
RewriteRule ^(.*)$ /drupal.phar/$1
To Top