ウェブサイト全体をバックアップし、ワンクリックで自動的にダウンロードするコードを作成しました。私のコードは次のようになります。
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 で「この Web ページは利用できません」と表示される 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 に設定されています (すべてのファイルを合わせたサイズの 2 倍以上)。
このコードは数週間前に 1,500 個のファイルに対して問題なく動作していたため、何が起こっているのか本当にわかりません。繰り返しになりますが、ZIP ファイルはまだ作成中で、PHP エラーはなく、これらのエラーが返されるのはブラウザだけです。