从PHP中的Phar存档复制特定目录

时间:2016-08-28 23:05:43

标签: php extract phar

所有都在标题中。我的应用程序存储在Phar中。 我的工作流程非常简单。

我使用 PHP 5.6

我在我的应用程序中做了一些事情,有时,我想将存储在我的Phar存档中的特定目录复制到存档之外的特定文件夹中。

我阅读了很多关于Phar::extractTo方法的内容,但是如果选择特定目录则无效。例如:

$phar->extractTo("/external_path", "folder_inside_phar");

大声喊叫folder_inside_phar是Phar档案中不存在的文件。此函数已声明有错误,因为它不了解文件夹。它只接受第二个参数的文件。

我确切地说,如果我没有提到特定文件夹,它会复制存档的所有内容。关于Phar访问或只读标志没有任何问题......

那么,是否有任何解决方法,或某人开发的类作为开源内容来解决此问题?

修改 我更改了单词" extract"通过"复制"

1 个答案:

答案 0 :(得分:0)

确实 extractTo 不能直接从 Phar 目录读取 - 所以,我想在这里分享一个潜在的工作,基本上使用 Phar Stream Wrapper phar://,它允许应用任何PHP 文件函数(file_get_contentsscandir、...)也适用于 Phar 档案。

让我们假设 Phar 构建器脚本如下所示(我使用 addFromString 来举例说明):

<?php
$phar = new Phar('bundle.phar');
$phar->startBuffering();
$phar->addFromString('a/a1.txt', 'contents of a/a1.txt');
$phar->addFromString('a/a2.txt', 'contents of a/a2.txt');
$phar->addFromString('b/b.txt', 'contents of b/b.txt');
$phar->setStub('<?php __HALT_COMPILER();');
$phar->stopBuffering();

提取目录 a/ 中的文件现在可能如下所示:

<?php
$targetDirectory = __DIR__ . '/target';
if (!is_dir($targetDirectory)) {
  mkdir($targetDirectory);
}
// read directory using Phar Stream Wrapper
// resolves to `['a1.txt', 'a2.txt']`
$files = scandir('phar://./bundle.phar/a/');
// prefix each file with local path `a/`, e.g. `a1.txt` -> `a/a1.txt`
// resolves to `['a/a1.txt', 'a/a2.txt']`
$files = array_map(function($file) { return 'a/' . $file; }, $files);
// actually extract resolved files to `$targetDirectory`
$phar = new \Phar('./bundle.phar');
$phar->extractTo($targetDirectory, $files);

因此,这里的主要方面是任何文件函数也可以用于流包装器 - 例如以下内容也可以:

copy('phar://./bundle.phar/b/b.txt', './target/b.txt');