压缩后如何立即使用 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 解压缩存档?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ZipFile 类从多个文件的 zip 存档中解压缩文件