【问题标题】:How to decompress an archive with Phar immediately after compressing it?压缩后如何立即使用 Phar 解压缩存档?
【发布时间】: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 进行了测试

标签: php phar


【解决方案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();

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 2022-12-21
    • 2010-10-13
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多