2016-01-11 146 views
4

我正在使用phps ZipArchive类创建目录的zip文件。对于几乎所有目录(除了两个目录),这些代码都可以正常工作(最大的目录包含51个文件,共175MB)。当我运行这些目录的代码时,会创建一个大小为67,108,864字节的临时文件('filename.zip。[RandomLettersAndNumbers]',例如'filename.zip.riaab4'),脚本会引发内部服务器错误(500)。PHP:使用ZipArchive创建zip文件时出现错误(500)

我到目前为止已经试过(大部分是仍然可见源):

  • 增加memory_limit
  • 增加max_execution_time
  • 检查PHP错误日志:错误日志为空
  • 尝试找到发生错误的确切行:代码执行到最多$zip_archive->close();

来源:

//Temporary (debugging) START 
ini_set("log_errors", 1); 
ini_set("error_log", "php-error.log"); 
error_log("Hello errors."); 
ini_set('memory_limit','512M'); 
set_time_limit(180); 
//phpinfo(); 
//Temporary (debugging) END 

//Get selected directory 
// --> Code removed 
$result['directory'] = 'directory1';  

//Create .zip file 
$zip_archive = new ZipArchive(); 
$ZIP = 'files/'.$result['directory'].'.zip'; 

if($zip_archive->open($ZIP, ZipArchive::CREATE | ZIPARCHIVE::OVERWRITE) !== TRUE) { 
    echo 'Error! Error while creating ZIP Archive.'; 
    die; 
} 

foreach(new DirectoryIterator('files/'.$result['directory']) as $fileInfo) { 
    if($fileInfo->isDot()) 
     continue; 
    if(file_exists($fileInfo->getPath())) 
     $zip_archive->addFile('files/'.$result['directory'].'/'.$fileInfo->getFilename(), $fileInfo->getFilename()); 
} 

//Temporary (debugging) START 
echo '<br><br><br>'; 
var_dump($zip_archive->close()); 
// ## The following lines are not executed!! ## 
echo '<br><br><br>'; 
var_dump($zip_archive->getStatusString()); 
echo '<br><br><br>'; 
//Temporary (debugging) END 

if($zip_archive->numFiles > 0 && $zip_archive->close() == true) 
    $FILE = $ZIP; 
else { 

} 

我是否错过了什么?如果还有其他事情我可以尝试,请让我知道。谢谢。

编辑:我有一个更具体的问题:为什么受影响的目录的临时zip文件都有67,108,864字节的文件大小?这是与php/server设置的最大文件大小有关还是可以用zip标准/ ZipArchive类来解释?

+0

Apache或Nginx?我认为,PHP的工作,但因为服务器不等待PHP完成 - 你看到错误500 – KoIIIeY

+0

所以,检查服务器错误,而不是PHP – KoIIIeY

+0

我使用的是虚拟主机服务,因此我没有访问实际的网络服务器。服务器错误日志是空的(除了一些不相关的“脚本头过早结束”错误)。根据客户服务,没有最大文件大小(可以将我的本地计算机上的目录压缩到服务器上的zip文件),并且没有最大执行时间。 – MatthewS

回答

0

尝试关闭ZIP存档,并在每5个左右文件添加到存档后重新打开它。我认为这个解决方案解决了内存限制问题。

感谢MatthewS提供此解决方案。

相关问题