PHP Conference Japan 2024

PharData::buildFromIterator

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

PharData::buildFromIterator从迭代器构建 tar 或 zip 压缩文件

描述

public PharData::buildFromIterator(Traversable $iterator, ?string $baseDirectory = null): array

从迭代器填充 tar 或 zip 压缩文件。支持两种样式的迭代器:一种将 tar/zip 中的文件名映射到磁盘上文件的名称,另一种(例如 DirectoryIterator)返回 SplFileInfo 对象。对于返回 SplFileInfo 对象的迭代器,需要第二个参数。

参数

iterator

任何迭代器,它要么关联地将 tar/zip 文件映射到位置,要么返回 SplFileInfo 对象

baseDirectory

对于返回 SplFileInfo 对象的迭代器,这是添加到 tar/zip 压缩文件时要从每个文件的完整路径中移除的部分。

返回值

PharData::buildFromIterator() 返回一个关联数组,将文件的内部路径映射到文件系统上文件的完整路径。

错误/异常

当迭代器返回不正确的值(例如字符串键而不是整数键)时,此方法返回 UnexpectedValueException;当传递基于 SplFileInfo 的迭代器但未提供 baseDirectory 参数时,返回 BadMethodCallException;如果保存 phar 压缩文件时出错,则返回 PharException

变更日志

版本 描述
8.1.0 PharData::buildFromIterator() 不再返回 false
8.0.0 baseDirectory 现在可以为空。

示例

示例 #1 使用 SplFileInfo 的 PharData::buildFromIterator()

对于大多数 tar/zip 压缩文件,压缩文件将反映实际的目录布局,第二种样式最为实用。例如,要创建一个包含此示例目录布局中文件的 tar/zip 压缩文件

/path/to/project/
                 config/
                        dist.xml
                        debug.xml
                 lib/
                     file1.php
                     file2.php
                 src/
                     processthing.php
                 www/
                     index.php
                 cli/
                     index.php

可以使用此代码将这些文件添加到“project.tar”tar 压缩文件

<?php
$phar
= new PharData('project.tar');
$phar->buildFromIterator(
new
RecursiveIteratorIterator(
new
RecursiveDirectoryIterator('/path/to/project')),
'/path/to/project');
?>

然后可以立即使用文件 project.tarPharData::buildFromIterator() 不设置压缩、元数据等值,可以在创建 tar/zip 压缩文件后进行设置。

有趣的是,PharData::buildFromIterator() 还可以用于复制现有 phar、tar 或 zip 压缩文件的内容,因为 PharData 对象继承自 DirectoryIterator

<?php
$phar
= new PharData('project.tar');
$phar->buildFromIterator(
new
RecursiveIteratorIterator(
new
Phar('/path/to/anotherphar.phar')),
'phar:///path/to/anotherphar.phar/path/to/project');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>

示例 #2 使用其他迭代器的 PharData::buildFromIterator()

第二种形式的迭代器可以与任何返回键 => 值映射的迭代器一起使用,例如 ArrayIterator

<?php
$phar
= new PharData('project.tar');
$phar->buildFromIterator(
new
ArrayIterator(
array(
'internal/file.php' => dirname(__FILE__) . '/somefile.php',
'another/file.jpg' => fopen('/path/to/bigfile.jpg', 'rb'),
)));
?>

参见

添加备注

用户贡献的备注 1 条备注

cbonnissent
10 年前
第一个示例中的代码在没有 RecursiveDirectoryIterator 中的 FilesystemIterator::SKIP_DOTS 标志的情况下(在 Linux 文件系统上)无法正常工作。

因此,要使用 phar 构建 tar 文件,我这样做(这里有两级迭代)

$pharTar = new \PharData($contentTar.".tar");
$firstLevelIterator = new \DirectoryIterator($this->inputPath);
foreach ($firstLevelIterator as $fileInfo) {
/* @var \SplFileInfo $fileInfo */
if (in_array($fileInfo->getFilename(), $allowedDirectory)) {
$recursiveDirectoryIterator = new \RecursiveDirectoryIterator(
$this->inputPath . DIRECTORY_SEPARATOR . $fileInfo->getFilename(), \FilesystemIterator::SKIP_DOTS);
$pharTar->buildFromIterator(new \RecursiveIteratorIterator($recursiveDirectoryIterator), $this->inputPath);
}
}
To Top