phar 扩展提供了一种方法,可以将整个 PHP 应用程序放入一个名为“phar”(PHP 存档)的单个文件中,以便于分发和安装。除了提供此服务外,phar 扩展还提供了一种文件格式抽象方法,用于通过 PharData 类创建和操作 tar 和 zip 文件,就像 PDO 提供了访问不同数据库的统一接口一样。与无法在不同数据库之间转换的 PDO 不同,Phar 还可以通过一行代码在 tar、zip 和 phar 文件格式之间转换。参见 Phar::convertToExecutable() 以获取一个示例。
什么是 phar? Phar 存档最显著的特点是,它们提供了一种方便的方法,可以将多个文件组合成一个单一文件。因此,phar 存档提供了一种方法,可以将完整的 PHP 应用程序分发在一个文件中,并在无需提取到磁盘的情况下运行它。此外,phar 存档可以通过 PHP 像其他文件一样轻松地执行,无论是在命令行还是在 Web 服务器上。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';
?>
实际上,您可以将 phar 存档完全当作外部磁盘一样对待,使用任何与 fopen() 相关的函数、opendir() 和 mkdir() 相关的函数来读取、更改或创建 phar 存档中的新文件和目录。这允许将完整的 PHP 应用程序分发在一个文件中,并直接从该文件运行。
phar 存档最常见的用途是将完整的应用程序分发在一个文件中。例如,与 PHP 版本捆绑在一起的 PEAR 安装程序以 phar 存档的形式分发。要使用以这种方式分发的 phar 存档,可以在命令行或通过 Web 服务器执行该存档。
Phar 存档可以作为 tar
存档、zip
存档或专门为 phar 扩展设计的自定义 phar
文件格式分发。每种文件格式都有优点和缺点。tar 和 zip 文件格式可以通过任何可以读取该格式的第三方工具读取或提取,但需要 phar 扩展才能与 PHP 一起运行。phar 文件格式是自定义的,专用于 phar 扩展,只能由 phar 扩展或 PEAR 包 » PHP_Archive 创建,但它具有以下优势:以这种格式创建的应用程序即使在禁用 phar 扩展的情况下也能运行。
换句话说,即使在禁用 phar 扩展的情况下,也可以执行或包含基于 phar 的存档。访问 phar 存档中的单个文件只能使用 phar 扩展,除非该 phar 存档是由 PHP_Archive 创建的。
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 存档)。
Phar 存档的实现基于 PEAR 包 » PHP_Archive,实现细节类似,尽管 phar 扩展功能强大得多。此外,phar 扩展允许大多数 PHP 应用程序在未经修改的情况下运行,而基于 PHP_Archive 的 phar 存档通常需要大量修改才能正常工作。