PHP 8.4.1 Released!

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 с помощью итератора. Поддерживаются два типа итераторов: итератор, связывающий файл на диске с файлом внутри архива и итератор в стиле DirectoryIterator, который возвращает объекты SplFileInfo. Для итераторов, возвращающих объекты SplFileInfo, второй параметр является обязательным.

Список параметров

iterator

Итератор, предоставляющий связки ключ=>значение, либо объекты SplFileInfo

baseDirectory

Для итераторов, возвращающих объекты SplFileInfo, часть полного пути добавляемых файлов, которая будет удаляться из полного пути внутри архива.

Возвращаемые значения

PharData::buildFromIterator() возвращает ассоциативный массив, связывающий путь к файлу внутри архива с полным путём к файлу на диске.

Ошибки

Метод выбрасывает исключение UnexpectedValueException, если итератор вернул некорректное значение, например целочисленный ключ вместо строки. Исключение BadMethodCallException выбрасывается когда задан итератор, возвращающий объекты SplFileInfo без задания параметра baseDirectory. В случае проблем с записью на диск бросается исключение PharException.

Список изменений

Версия Описание
8.1.0 PharData::buildFromIterator() больше не возвращает значение false.
8.0.0 baseDirectory теперь допускает значение null.

Примеры

Пример #1 Пример использования PharData::buildFromIterator() с SplFileInfo

Для большинства 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":

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

Файл project.tar можно использовать сразу же после его создания. PharData::buildFromIterator() не производит настройки сжатия или добавления метаданных. Эти действия необходимо произвести самостоятельно, после создания архива.

Интересное замечание: 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 note

up
1
cbonnissent
10 years ago
The code in the first exemple doesn't work properly without the flag FilesystemIterator::SKIP_DOTS in the RecursiveDirectoryIterator (on a linux filesystem).

So, to build a tar with a phar, I do (with two level of iteration here) :

$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