【问题标题】:Copy a specific directory from Phar archive in PHP从 PHP 中的 Phar 存档中复制特定目录
【发布时间】:2017-01-04 21:55:56
【问题描述】:

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

我使用 PHP 5.6

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

我阅读了很多关于Phar::extractTo 方法的内容,但如果我选择特定目录,它就不起作用。例如:

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

告诉我folder_inside_phar 是 Phar 存档中不存在的文件。此函数已被声明为有错误,因为它不理解文件夹。它只接受第二个参数的文件。

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

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

编辑 我把“extract”这个词改成“copy”

【问题讨论】:

  • 请问您为什么要这样做? Phars 通常用于打包代码以实现可移植性和使用,而不是像 zip 存档或其他东西那样再次解包
  • 我制作了一个Web应用生成器,它可以在进程结束时提供一些静态内容,如bootstrap或jQuery。
  • 也许您可以从 CDN 使用 curl 进行安装,而不是打包它。我知道顺便说一句,这并不能回答你的问题:-)
  • 是的 :) 但我也提供了一些静态代码,例如我自己编写的欢迎页面。
  • :) 如果我不想打扰我,我可以将所有静态内容放入另一个文件夹并通过 shell 脚本执行我的应用程序。但主要的兴趣是所有文件都存储在同一个存档中,以便能够离线开发。我了解 GitHub 解决方案是一个很好的解决方法,但它不符合我的需求。

标签: php extract phar


【解决方案1】:

确实,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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多