2024 PHP 日本大会

使用 Phar 归档:Phar 和 PharData 类

Phar 类支持读取和操作 Phar 归档,并通过继承自 RecursiveDirectoryIterator 类的功能进行迭代。通过支持 ArrayAccess 接口,可以像访问关联数组一样访问 Phar 归档内的文件。

PharData 类扩展了 Phar 类,允许创建和修改非可执行(数据)tar 和 zip 归档,即使 php.ini 中的 phar.readonly=1 也是如此。因此,PharData::setAlias()PharData::setStub() 都被禁用,因为别名和存根的概念是可执行 phar 归档所特有的。

需要注意的是,在创建 Phar 归档时,应将完整路径传递给 Phar 对象构造函数。相对路径将导致初始化失败。

假设 $p 是一个如下初始化的 Phar 对象

<?php
$p
= new Phar('/path/to/myphar.phar', 0, 'myphar.phar');
?>

将在 /path/to/myphar.phar 创建一个空的 Phar 归档,或者如果 /path/to/myphar.phar 已经存在,则将其重新打开。myphar.phar 字面量演示了别名的概念,该别名可用于在 URL 中引用 /path/to/myphar.phar,例如:

<?php
// 如果 /path/to/myphar.phar 在其清单中具有显式的 "myphar.phar" 别名,
// 或如果使用之前的示例中的 Phar 对象设置初始化了 phar,则这两个 file_get_contents() 调用是等效的。
$f = file_get_contents('phar:///path/to/myphar.phar/whatever.txt');
$f = file_get_contents('phar://myphar.phar/whatever.txt');
?>

使用新创建的 $p Phar 对象,可以执行以下操作:

  • $a = $p['file.php'] 创建一个 PharFileInfo 类,该类引用 phar://myphar.phar/file.php 的内容。
  • $p['file.php'] = $v 创建一个新文件 (phar://myphar.phar/file.php),或覆盖 myphar.phar 中的现有文件。$v 可以是字符串或打开的文件指针,在这种情况下,将使用文件的全部内容来创建新文件。请注意,$p->addFromString('file.php', $v) 与上述功能等效。还可以使用 $p->addFile('/path/to/file.php', 'file.php') 添加文件的内容。最后,可以使用 $p->addEmptyDir('empty') 创建一个空目录。
  • isset($p['file.php']) 可用于确定 phar://myphar.phar/file.php 是否存在于 myphar.phar 中。
  • unset($p['file.php'])myphar.phar 中删除 phar://myphar.phar/file.php

此外,Phar 对象是通过 Phar::getMetadata() 访问 Phar 特定元数据的唯一方法,并且是通过 Phar::getStub()Phar::setStub() 设置或检索 Phar 归档的 PHP 加载器存根的唯一方法。此外,一次只能使用 Phar 类来操作整个 Phar 归档的压缩。

Phar 对象功能的完整列表如下所述。

PharFileInfo 类扩展了 SplFileInfo 类,并添加了一些方法来操作 Phar 中包含的文件的 Phar 特定细节,例如操作压缩和元数据。

添加注释

用户贡献注释

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