(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)
PharData::buildFromIterator — Создание tar/zip-архива с помощью итератора
Наполнение архив 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'),
)));
?>