PHP Conference Japan 2024

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 現在可以為 null。

範例

範例 #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 則註釋

1
cbonnissent
10 年前
在 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