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

问题描述

我正在尝试编写一个类,该类应创建档案并对其进行压缩和/或解压缩压缩的档案。

创建存档,然后对其进行压缩或分别对压缩的存档进行解压缩都是没有问题的。

但是,如果我在紧接彼此之后立即执行它们,则phar会认为旧的存档文件仍然存在,但是由于我通过取消链接删除了该文件,因此它实际上已经不存在了。

那么谁能解释下面的示例为何失败?

PHP致命错误:未捕获BadMethodCallException:无法新添加 转换后的法尔 “ test.tar”到列表 phars中,已经存在具有该名称的法尔

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();

解决方法

显然,归档文件仍驻留在内存中,因此不足以将其从文件系统中删除。

Phar类提供了静态方法Phar::unlinkArchive 为此。

还请注意,在使用test.tar删除文件之前,必须关闭所有Phar::unlinkArchive的文件句柄,这可以通过用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();