Phar::buildFromIterator

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

Phar::buildFromIteratorСоздает phar-архив из итератора

Описание

public Phar::buildFromIterator ( Iterator $iter [, string $base_directory ] ) : array

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Заполняет phar-архив из итератора. Поддерживаются итераторы двух типов: такие, в которых отображается соответствие имени файла внутри phar-архива к файлу на диске, и такие как DirectoryIterator, которые возвращают объекты SplFileInfo. Для итераторов, которые возвращают объекты SplFileInfo, второй параметр является обязательным.

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

iter

Любой итератор, который или ассоциативно отображает пукти к файлам внутри phar-архива к файлам на диске, или возвращает объекты SplFileInfo.

base_directory

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

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

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

Примеры

Пример #1 Пример использования Phar::buildFromIterator() с объектами SplFileInfo

Для большинства phar-архивов, архив будет отражать фактическую структуру директории, и второй тип итератора будет наиболее полезным. Например, он будет полезным для создания phar-архива, содержащего файлы со структурой директорий как в этом примере:

/путь/к/проекту/
                 config/
                        dist.xml
                        debug.xml
                 lib/
                     file1.php
                     file2.php
                 src/
                     processthing.php
                 www/
                     index.php
                 cli/
                     index.php

Для добавления этих файлов в phar-архив "project.phar" может быть использован следующий код:

<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar'0'project.phar');
$phar->buildFromIterator(
    new 
RecursiveIteratorIterator(
     new 
RecursiveDirectoryIterator('/путь/к/проекту')),
    
'/путь/к/проекту');
$phar->setStub($phar->createDefaultStub('cli/index.php''www/index.php'));
?>

После этого файл project.phar может быть использован немедленно. Такие значения как сжатие и метаданные не устанавливаются методом Phar::buildFromIterator() и могут быть установлены после создания phar-архива.

В качестве интересного замечания можно отметить, что Phar::buildFromIterator() также может быть использован для копирования содержимого существующего phar-архива, поскольку класс Phar является потомком DirectoryIterator:

<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar'0'project.phar');
$phar->buildFromIterator(
    new 
RecursiveIteratorIterator(
     new 
Phar('/путь/к/anotherphar.phar')),
    
'phar:///путь/к/anotherphar.phar/путь/к/проекту');
$phar->setStub($phar->createDefaultStub('cli/index.php''www/index.php'));
?>

Пример #2 Пример использования Phar::buildFromIterator() с другими типами итераторов

Второй тип предполагает использование любого итератора, возвращаемые значения которого отображают соответствие имени файла внутри phar-архива к файлу на диске, как в случае с ArrayIterator:

<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar'0'project.phar');
$phar->buildFromIterator(
    new 
ArrayIterator(
     array(
        
'путь/внутри/архива/file.php' => dirname(__FILE__) . '/somefile.php',
        
'друго/путь/внутри/архива/file.jpg' => fopen('/путь/к/bigfile.jpg''rb'),
     )));
$phar->setStub($phar->createDefaultStub('cli/index.php''www/index.php'));
?>

Ошибки

Этот метод выбрасывает исключение UnexpectedValueException, когда итератор возвращает некорректные значения, такие как целочисленный ключ вместо строки. Исключение BadMethodCallException будет брошено, когда итератор, основанный на SplFileInfo, используется без параметра base_directory. Исключение PharException выбрасывается в случае ошибок сохранения phar-архива.

Смотрите также

  • Phar::buildFromDirectory() - Создает phar-архив из файлов, расположенных внутри директории

add a note add a note

User Contributed Notes 2 notes

up
10
cweiske at php dot net
4 years ago
You have to set a flag on the RecursiveDirectoryIterator because by default, the current (".") and parent directory ("..") are included in the listing. This leads to an error message similar to "returned a path ".." that is not in the base directory".

To fix this, use "SKIP_DOTS":

<?php
new RecursiveDirectoryIterator(
   
$srcRoot, FilesystemIterator::SKIP_DOTS
);
?>
up
0
M8
2 years ago
Phars created from iterator (unlike from directory) does not have full-fledged directory structure. For example, functions like opendir() will fail, although fopen() does not.
To Top