zipchive::getStatusString():无效或未初始化的Zip对象


ZipArchive::getStatusString(): Invalid or uninitialized Zip object

下面的代码将无法在PHP 5.6.12中创建ZIP文件,也无法打印出ZIP错误消息,而是显示错误/警告

Warning: ZipArchive::getStatusString(): Invalid or uninitialized Zip object in /tmp/x.php on line 9

但是为什么呢?

<?php
// TODO: Check for errors
$tempPath = tempnam('/tmp', 'ztmp');
$zip = new ZipArchive();
$res = $zip->open($tempPath, ZipArchive::OVERWRITE | ZipArchive::CREATE | ZipArchive::EXCL);
if ( $res !== true )
    die($zip->getStatusString()."'n");

看起来语义有所改变;目前还不清楚这是故意的还是错误的。

无论如何,问题是我们有一个空文件,它不是一个有效的ZIP,但它仍然被打开,并且没有正确初始化,即使我们请求文件被覆盖。

所以解决方法是删除现有文件,然后重新创建它:

<?php
$tempPath = tempnam('/tmp', 'ztmp');
// Delete first
@unlink($tempPath);
$zip = new ZipArchive();
$res = $zip->open($tempPath, ZipArchive::OVERWRITE | ZipArchive::CREATE | ZipArchive::EXCL);
if ( $res !== true )
    die($zip->getStatusString()."'n");

我知道这已经有一年了,但我注意到这里使用的是ZipArchive::EXCL。

http://php.net/manual/en/zip.constants.php

ZipArchive::EXCL (integer)
 如果存档已经存在,则错误。