压缩后如何立即使用 Phar 解压缩存档?

Posted

技术标签:

【中文标题】压缩后如何立即使用 Phar 解压缩存档?【英文标题】:How to decompress an archive with Phar immediately after compressing it? 【发布时间】:2021-01-01 04:26:40 【问题描述】:

我正在尝试编写一个应该创建存档并压缩它和/或解压缩压缩存档的类。

创建一个存档然后将其压缩或单独解压缩一个压缩存档都没有问题。

但是,如果我在彼此 phar 认为旧存档文件仍然存在之后立即执行这些操作,但是由于我通过取消链接删除了该文件,因此它实际上不再存在。

那么谁能解释为什么下面的例子失败了?

php 致命错误:未捕获的 BadMethodCallException:无法新添加 转化的phar “test.tar”到列表 phars,同名的phar已经存在

mkdir("test");
file_put_contents("test/a", "testa");
file_put_contents("test/b", "testb");

$phar = new PharData("test.tar");
$phar->buildFromDirectory('test');
$phar->compress(Phar::GZ);

unset($phar);
unlink("test.tar");

$phar = new PharData("test.tar.gz");
$phar->decompress();

【问题讨论】:

这是 PHP 7.4 特有的吗? @Dharman 不完全是,但仅使用 php 7.4 进行了测试 【参考方案1】:

显然存档仍然驻留在内存中,因此从文件系统中删除它是不够的。

Phar 类提供了静态方法Phar::unlinkArchive 这样做。

还请注意,在使用Phar::unlinkArchive 将其删除之前,您必须关闭test.tar 的所有文件句柄,这可以通过使用unset($phar) 取消设置持有文件句柄的对象来完成

所以下面将上面的例子修改为使用Phar::unlinkArchive

mkdir("test");
file_put_contents("test/a", "testa");
file_put_contents("test/b", "testb");

$phar = new PharData("test.tar");

$phar->buildFromDirectory('test');

$phar->compress(Phar::GZ);

unset($phar);
Phar::unlinkArchive("test.tar");

$phar = new PharData("test.tar.gz");
$phar->decompress();

【讨论】:

以上是关于压缩后如何立即使用 Phar 解压缩存档?的主要内容,如果未能解决你的问题,请参考以下文章

在 Cordova 中解压缩多部分存档

使用 ZipFile 类从多个文件的 zip 存档中解压缩文件

解压缩 .gz 文件并将它们存储在 .tar.gz 存档中

我如何更新此代码以第二次运行但仅在已解压缩的 zip 存档上运行?

解压缩包含多个条目的存档

如何在 Python3 中解压缩使用 PKZIP 以外的算法加密的文件?