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

标签 php extract phar

一切都在标题中。我的应用程序存储在 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_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');

关于php - 从 PHP 中的 Phar 存档复制特定目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39196578/

相关文章:

PHAR 和 ZLIB 的 PHP 问题

php - 将 Web 应用程序 (ZF2) 转换为 PHAR

php - 如何将 PHP 插入到 jQuery 中?

c# - 如何在 C# 中从 HTML 文件中提取图像 url

Python:使用 ctypes 从缓冲区中提取数据

iphone - 找出 iOS 中特定文件的数据保护类别

php - 如何以兼容的方式包含 PHP 文件,以便在有和没有 Phar 的情况下进行打包?

php - 如何将表从mysql数据库导出到excel?

php包含文件执行失败

php - 我可以防止 PDO 中的长查询吗?