对某些人来说,这可能看起来很明显,但这是我自己的疏忽。
如果您要向压缩文件中添加要删除的文件,请确保在调用 close() 函数后删除这些文件。
如果添加到对象的文件在保存时不可用,则不会创建压缩文件。
(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)
ZipArchive::close — 关闭活动归档文件(已打开或新创建)
关闭已打开或创建的归档文件并保存更改。此方法会在脚本结束时自动调用。
如果归档文件不包含任何文件,则根据ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE
全局标志的值,默认情况下会完全删除该文件(不会写入空归档文件)。
此函数没有参数。
对某些人来说,这可能看起来很明显,但这是我自己的疏忽。
如果您要向压缩文件中添加要删除的文件,请确保在调用 close() 函数后删除这些文件。
如果添加到对象的文件在保存时不可用,则不会创建压缩文件。
如果您正在向压缩文件中添加多个文件,并且您的 $zip->close() 调用返回 FALSE,请确保您添加的所有文件都实际存在。显然,即使文件实际上不存在,$zip->addFile() 也会返回 TRUE。在对其调用 $zip->addFile() 之前,最好使用 file_exists() 或 is_readable() 检查每个文件。
ZipArchive.close() 在 PHP7 中改变了其行为。该函数在 PHP5 中忽略目录,但在 PHP7 中会失败,并出现以下错误:
意外的 PHP 错误 [ZipArchive::close(): 读取错误:是目录]
以下代码在 PHP5 中有效,但在 PHP7 中无效
<?php
// test.php
$zip = new ZipArchive();
$zip->open('/tmp/test.zip', ZipArchive::CREATE);
$zip->addFile('.', '.');
$ret = $zip->close();
echo "Closed with: " . ($ret ? "true" : "false") . "\n";
?>
对于 php5
php --version
PHP 5.5.38-1-avature-ondrej-fork (cli) (built: Aug 31 2016 16:37:38)
php test.php
Closed with: true
对于 php7
php --version
PHP 7.0.8-0ubuntu0.16.04.2 (cli) ( NTS )
php test.php
Closed with: false
如果您创建了一个压缩文件并向其中添加了一个文件,但没有错误,但 ZipArchive::close 调用失败(出现 ER_TMPOPEN: "无法创建临时文件")并且未创建压缩文件,请检查您的 ZipArchive::open 调用是否指定了包含不存在目录的路径名。如果您期望包含一个或多个目录的层次结构,则必须在使用 ZipArchive 之前自行创建这些目录。您可以编写一个简单的函数,使用 dirname 递归查找每个父目录,并在退出递归时使用 mkdir 创建不存在的目录。
我不确定,但似乎如果在 $zip->open 中指定的路径是相对路径而不是绝对路径,则 $zip->close() 可能会遇到错误。
因此,在创建归档文件时,请为要创建的压缩文件指定绝对路径,而不是相对路径。
不要忘记检查压缩文件是否为空,否则根本不会创建压缩文件,并且服务器不会发出任何警告!
我使用某个循环将文件添加到压缩文件中,并且在几个小时内苦苦挣扎于权限和文档,直到我意识到该循环最终没有添加任何文件,即使调用了 addFile,但它是在一个不存在的文件上调用的。
这可能是您的压缩文件没有出现的原因为。
请注意,ZipArchive::addFile() 只打开文件描述符,而不压缩它。只有 ZipArchive::close() 才会压缩文件,并且需要相当长的时间。请注意超时问题。