Следующий код не сможет создать ZIP-файл в PHP 5.6.12, а также не сможет распечатать сообщение об ошибке ZIP, вместо этого появится сообщение об ошибке / предупреждении
Warning: ZipArchive::getStatusString(): Invalid or uninitialized Zip object in /tmp/x.php on line 9
Но почему? Это когда-то работало в PHP 5.4.
<?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 (целое число)
Ошибка, если архив уже существует.