一切都在标题中。我的应用程序存储在 Phar 中。 我的工作流程非常简单。
我使用 PHP 5.6。
我在我的应用程序中做了一些事情,有一刻,我想将存储在我的 Phar 存档中的特定目录复制到存档外的特定文件夹中。
我读了很多关于 Phar::extractTo 的东西方法,但如果我选择特定目录,它就不起作用。例如:
$phar->extractTo("/external_path", "folder_inside_phar");
告诉我 folder_inside_phar
是 Phar 存档中不存在的文件。此函数已被声明为有错误,因为它不理解文件夹。它只接受第二个参数的文件。
我准确地说,如果我没有提及特定文件夹,它会复制存档的所有内容。 Phar access or readonly flag 没有任何问题...
那么,是否有任何解决方法,或者有人开发的类作为开源内容来解决这个问题?
编辑 我将“提取”一词改为“复制”
最佳答案
确实 extractTo
不能直接从 Phar 目录读取 - 所以,我想在这里分享一个潜在的工作,基本上使用 Phar Stream Wrapper phar://
允许将任何 PHP 文件函数(file_get_contents
、scandir
、...)应用于 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');
关于php - 从 PHP 中的 Phar 存档复制特定目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39196578/