问题描述
我正在尝试编写一个类,该类应创建档案并对其进行压缩和/或解压缩压缩的档案。
创建存档,然后对其进行压缩或分别对压缩的存档进行解压缩都是没有问题的。
但是,如果我在紧接彼此之后立即执行它们,则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();