什么是 phar?Phar是一种PHP归档文件格式,它的最大特点是可以将多个文件组合成一个文件。因此,Phar归档提供了一种在单个文件中分发完整的PHP应用程序的方式,无需将其解压到磁盘上,直接通过运行该文件即可使用。此外,Phar归档可以像任何其他文件一样由PHP在命令行和Web服务器上执行。可以将Phar看作是移动存储器,方便携带和分发PHP应用程序。
一、 Phar概述
Phar扩展提供了一种将整个PHP应用程序打包成单个名为“phar”(PHP Archive)文件的方法,以便进行分发和安装。除了这项功能外,Phar扩展还提供了一种文件格式抽象方法,通过PharData类可以创建和操作tar和zip文件,就像PDO提供了访问不同数据库的统一接口一样。与PDO只能处理特定数据库而无法直接转换不同数据库之间的区别不同,Phar可以通过一行代码在tar、zip和phar文件格式之间进行转换。
phar 通过 stream 封装协议实现这个功能。通常,要在 PHP 脚本中使用外部文件,将使用 include:
使用外部文件示例:
<?php include '/path/to/external/file.php'; ?>
PHP 实际上将 /path/to/external/file.php 转换为 stream 封装协议file:///path/to/external/file.php,在底层,实际上使用普通文件 stream 封装协议 stream 函数访问所有的本地文件。
要使用 phar 归档 /path/to/myphar.phar 中名为 file.php 的文件,语法跟上面的 file:// 语法非常相似。使用 phar 归档内部文件示例:
<?php include 'phar:///path/to/myphar.phar/file.php'; ?>
实际上可以将 phar 归档完全视为外部磁盘,可以使用任何 fopen() 相关函数,opendir() 和 mkdir() 相关函数在 phar 归档内读取、更改、创建新文件或目录。这将允许完整 PHP 应用程序分布在单个文件中,并直接从该文件中运行。
phar 归档最常见的用法是在单个文件中分发完整的应用程序。例如,PEAR 安装程序与 PHP 版本捆绑作为 phar 归档分发。要使用以这种方式分发 phar 归档,可以在命令行或通过 Web 服务器执行归档操作。
- phar 归档可以作为 tar 归档、zip 归档或专门为 phar 扩展设计的自定义 phar 文件格式分发。每种文件格式都有优点和缺点。
- tar 和 zip 文件格式可以由任何可以读取格式的第三方工具读取或提取,但需要 PHP 和 phar 扩展才能运行;
phar 文件格式是针对 phar 扩展定制和独有的,只能由 phar 扩展或 PEAR 包 » PHP_Archive 创建,优点是以这种格式创建的应用程序即使未启用 phar 扩展也能运行。换句话说,即使禁用了 phar 扩展,也可以执行或包含基于 phar 的归档。只有使用 phar 扩展才能访问 phar 归档中的单个文件,除非 phar 归档是由 PHP_Archive 创建的。
phar 扩展还能够在单个命令中将 phar 归档从 tar 转换为 zip 或 phar 文件格式:
<?php $phar = new Phar('myphar.phar'); $pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // makes myphar.phar.tar.gz ?>
phar 可以使用 gzip 或 bzip2 来压缩单个文件或整个归档,并且可以通过使用 MD5、SHA-1、SHA-256 或 SHA-512 签名自动验证归档完整性。
最后,phar 扩展有安全意识,默认禁用对可执行 phar 归档的写访问,并且需要系统级禁用 phar.readonly php.ini 设置才能创建或修改 phar 归档。没有可执行存根(executable stub)的普通 tar 和 zip 归档始终可以使用 PharData 类创建或修改。
二、运行时配置
以下函数的行为受 php.ini 中的设置影响:
phar.readonly bool:在使用 phar 流或 Phar 对象的写入操作时, 本选项可以禁止创建、修改 Phar 归档。 在生产环境中推荐始终启用本设置,否则伴随其他常见安全漏洞, phar 扩展支持写入时也能创建基于 PHP 的病毒。
注意:出于安全考虑,只能在 php.ini 中取消此设置。 若在 php.ini 中禁用 phar.readonly,可以在代码中启用 phar.readonly 或其后禁用它。 若在 php.ini 中启用 phar.readonly,在代码中只能 “重复启用” INI 变量,不能禁用。
phar.require_hash bool:此选项要求调用的所有 Phar 归档必须包含签名(目前支持的签名类型有 MD5、SHA1、SHA256、SHA512、OpenSSL), 而且会拒绝处理不含签名的 Phar 归档。
注意:
- 只能在 php.ini 中取消此设置。 若在 php.ini 中禁用 phar.require_hash,可以在代码中启用 phar.require_hash 或其后禁用它; 若在 php.ini 中启用 phar.require_hash,在代码中可以 “重复启用” INI 变量,但不能禁用它;此选项不影响 PharData 类读取普通 tar 文件;
- phar.require_hash 本身不提供任何安全保障,它只能阻止运行因意外而损坏的 Phar 归档, 因为任何人都可以篡改 Phar 归档后轻松修改成对应的签名。
phar.cache_list string:允许 web 服务启动时预先解析映射 phar 归档,提供性能上的优化, 使得从 phar 归档中运行文件的速度几乎接近从传统的基于磁盘安装运行这些文件的速度。
phar.cache_list 用法示例:
在 php.ini 中(windows): phar.cache_list =C:\path\to\phar1.phar;C:\path\to\phar2.phar 在 php.ini 中(unix): phar.cache_list =/path/to/phar1.phar:/path/to/phar2.phar
三、预定义常量
下列常量由此扩展定义,且仅在此扩展编译入 PHP 或在运行时动态载入时可用。
1、Phar压缩常数
2、Phar文件格式常量
3、Phar签名常量
4、Phar webPhar mime覆盖常量