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
9 年前
第一个示例中的代码在没有 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