我创建了一个代码来备份整个网站并单击即可自动下载。这是我的代码的样子:
if (file_exists("file.zip")) {
unlink("file.zip");
}
$folder_array = array();
$file_array = array();
function listFolderFiles($dir){
global $folder_array;
global $file_array;
$ffs = scandir($dir);
foreach($ffs as $ff){
if ($ff != '.' && $ff != '..') {
if (is_dir($dir.'/'.$ff)) {
$new_item = "$dir/$ff";
$new_item = str_replace('..//','',$new_item);
if ($new_item !== "stats") {
array_push($folder_array, $new_item);
listFolderFiles($dir.'/'.$ff);
}
}
else {
$new_item = "$dir/$ff";
$new_item = str_replace('..//','',$new_item);
if (($new_item !== "stats/logs") && ($new_item !== "stats/")) {
array_push($file_array, $new_item);
}
}
}
}
}
listFolderFiles('../');
$zip = new ZipArchive;
if ($zip->open('file.zip', true ? ZIPARCHIVE::OVERWRITE:ZIPARCHIVE::CREATE) === TRUE) {
foreach($folder_array as $folder) {
$zip->addEmptyDir($folder);
}
foreach($file_array as $key => $file) {
$file_path = "../$file";
$zip->addFile($file_path, $file);
}
}
$zip->close();
$file = "file.zip";
chmod("$file", 0700);
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=". $file);
readfile($file);
现在这段代码在一段时间内运行良好,但今天看来它不想工作。问题是,这不是 PHP 脚本错误。我检查了我的错误日志,没有任何显示。这似乎是浏览器错误,但每个浏览器都会显示不同的消息:
Chrome 显示“此网页不可用” Firefox 显示“连接已重置” Internet Explorer 显示“此页面无法显示”
即使出现这些错误,ZIP 文件仍在创建中,我可以从服务器下载它。
以下是经过广泛研究后我尝试过的事情清单:
1)我删除了自动下载 ZIP 文件的代码(所有代码都是在我关闭 ZIP 文件后编写的)。仍然得到浏览器错误。
2)我读到可能有太多文件被打开并且超出了我的限制。我添加了代码以在每 200 个文件后关闭并重新打开 ZIP 文件。仍然没有工作。
3) 我将文件数量限制为 ZIP。低于 500 时一切正常。在 500 到 1,000 个文件之间,代码将在部分时间内工作。有时它会顺利通过,其他的它会给我浏览器错误。在 1,000 左右之后,它根本无法正常工作。
托管是通过 GoDaddy 进行的。
PHP 版本为 5.2.17
max_execution_time 设置为 240(代码永远不会这么长,通常只需要大约 30 秒即可运行)
memory_limit 设置为 500M(超过所有文件组合大小的两倍)
我很茫然,我真的不知道发生了什么,因为几周前这段代码对 1,500 个文件运行良好。同样,ZIP 文件仍在创建中,没有 PHP 错误,只有浏览器返回这些错误。