2024年PHP日本大会

介绍

phar扩展提供了一种方法,可以将整个PHP应用程序打包到一个名为“phar”(PHP Archive)的单个文件中,以便于分发和安装。除了提供此服务外,phar扩展还提供了一种文件格式抽象方法,用于通过PharData类创建和操作tar和zip文件,就像PDO提供了一个访问不同数据库的统一接口一样。与PDO(无法在不同数据库之间转换)不同,Phar还可以通过一行代码在tar、zip和phar文件格式之间进行转换。参见Phar::convertToExecutable()示例。

什么是phar?Phar存档最显著的特点是将多个文件方便地组合到单个文件中的方法。因此,phar存档提供了一种方法,可以将完整的PHP应用程序分发到单个文件中,并可以直接从该文件运行,而无需将其解压到磁盘。此外,phar存档可以像任何其他文件一样轻松地由PHP执行,无论是在命令行还是在Web服务器上。Phar有点像PHP应用程序的U盘。

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存档是由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存档中有一些有用的提示。

单词pharPHPArchive的混合词,并且基于Java开发人员熟悉的jar(Java Archive)。

Phar存档的实现基于PEAR包» PHP_Archive,并且实现细节类似,尽管Phar扩展功能更强大。此外,Phar扩展允许运行大多数未修改的PHP应用程序,而基于PHP_Archive的phar存档通常需要大量修改才能工作。

添加备注

用户贡献的备注

此页面没有用户贡献的备注。
To Top