PHP 8.5.0 Alpha 2 available for testing

PharData::buildFromIterator

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

PharData::buildFromIteratorConstruye un archivo tar o zip a partir de un iterador

Descripción

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

Rellena un archivo tar o zip a partir de un iterador. Dos estilos de iteradores son soportados, los iteradores que hacen corresponder la ruta de archivo dentro del archivo con la ruta en el disco y los iteradores como DirectoryIterator que devuelven objetos SplFileInfo. Para los iteradores que devuelven objetos SplFileInfo, el segundo argumento es requerido.

Parámetros

iterator

Cualquier iterador que haga corresponder de forma asociativa un archivo tar/zip o que devuelva objetos SplFileInfo

baseDirectory

Para los iteradores que devuelven objetos SplFileInfo, la parte del camino completo hacia el archivo a eliminar al añadir al archivo tar/zip

Valores devueltos

PharData::buildFromIterator() devuelve un array asociativo que hace corresponder una ruta de archivo interna con una ruta completa hacia el archivo en el sistema de archivos.

Errores/Excepciones

Este método devuelve una excepción UnexpectedValueException cuando el iterador devuelve valores incorrectos, como una clave entera en lugar de una cadena, una excepción BadMethodCallException cuando se pasa un iterador basado en SplFileInfo sin el argumento baseDirectory, o una excepción PharException si se han encontrado errores al guardar el archivo phar.

Historial de cambios

Versión Descripción
8.1.0 PharData::buildFromIterator() ya no devuelve false ahora.
8.0.0 baseDirectory ahora es nullable.

Ejemplos

Ejemplo #1 Ejemplo con PharData::buildFromIterator() y SplFileInfo

Para la mayoría de los archivos tar/zip, el archivo reflejará la estructura de directorio actual y el segundo estilo es el más útil. Por ejemplo, para crear un archivo tar/zip que contenga los archivos con la estructura de directorio a continuación:

/chemin/vers/projet/
                 config/
                        dist.xml
                        debug.xml
                 lib/
                     fichier1.php
                     fichier2.php
                 src/
                     processthing.php
                 www/
                     index.php
                 cli/
                     index.php

Este código puede ser utilizado para añadir archivos a el archivo "projet.tar" tar:

<?php
$phar
= new PharData('projet.tar');
$phar->buildFromIterator(
new
RecursiveIteratorIterator(
new
RecursiveDirectoryIterator('/chemin/vers/projet')),
'/chemin/vers/projet');
?>

El archivo projet.tar puede entonces ser borrado inmediatamente. PharData::buildFromIterator() no establece parámetros como la compresión, las metadatos, lo cual puede ser hecho después de haber creado el archivo tar/zip.

Se debe notar que Phar::buildFromIterator() también puede ser utilizado para copiar el contenido de un archivo phar, tar o zip existente, ya que el objeto PharData es derivado de DirectoryIterator:

<?php
$phar
= new PharData('projet.tar');
$phar->buildFromIterator(
new
RecursiveIteratorIterator(
new
Phar('/chemin/vers/unautrephar.phar')),
'phar:///chemin/vers/unautrephar.phar/chemin/vers/projet');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>

Ejemplo #2 Ejemplo con PharData::buildFromIterator() y otros iteradores

La segunda forma de iterador puede ser utilizada con cualquier iterador que devuelva una asociación clave => valor, tal como ArrayIterator:

<?php
$phar
= new PharData('projet.tar');
$phar->buildFromIterator(
new
ArrayIterator(
array(
'interne/fichier.php' => dirname(__FILE__) . '/unfichier.php',
'unautre/fichier.jpg' => fopen('/chemin/vers/grosfichier.jpg', 'rb'),
)));
?>

Ver también

add a note

User Contributed Notes 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