Я создаю резервную систему zip для резервного копирования целых сайтов и всего контента.
У меня есть код, позволяющий пользователю выбрать один из сайтов из списка, созданного в форме, и отправить данные формы в конструктор zip php. (код ниже)
Проблема, с которой я сталкиваюсь, заключается в том, что если сайт является сайтом блогов / постов, который содержит много изображений и файлов, таких как плагины, каталоги, документы, которые могут иметь размер 4 гигабайта или более, то я не получаю обратный Ajax-ответ.
Другая проблема заключается в том, что нет способа измерить, что почтовый индекс в настоящее время создается для пользователя, и, поскольку я использую Ajax, он возвращается в модальный режим со ссылкой на сайт, поэтому, даже если почтовый индекс занимает 3 минуты, пользователь не мудрее, пока Ajax не вернёт ссылку и не отобразится в модале.
Я провел некоторый поиск и не нашел ни одного решения или отправной точки, которые бы помогли.
Я хотел бы знать, есть ли какой-нибудь способ узнать, полностью ли закончился zip-файл, созданы ли большие файлы (без тайм-аутов) или как отслеживать ход выполнения zip-файла, то есть процент выполнения, чтобы пользователь хотя бы знал, что это делается на заднем плане.
Любая помощь будет принята с благодарностью! И я более чем счастлив купить кому-то кофе или пиво для их усилий.
Мой код PHP
<?php
if (isset($_POST["fname"]) && !empty($_POST["fname"])) {
// Get the name of the folder to save zip
$fname = $_POST['fname'];
// Set if its a single file or directory
$direct_single = $_POST['ziptype'];
// Remove / and replace with - ..
$fname_safe = str_replace("/", "-", $fname);
/////////////////////////////////////////////////////////////////////////
// Random 20 length string to create unique download
/////////////////////////////////////////////////////////////////////////
function generateRandomString($length = 20)
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
/////////////////////////////////////////////////////////////////////////
// ZIP up directory files
/////////////////////////////////////////////////////////////////////////
// Temp folder to save to
$folder_for_saving = 'temp_zips_folder/';
// Random name generator
$random_name = generateRandomString();
// Build the name with random code included
$random_name_fin = $random_name . '-' . $fname_safe . '.zip';
// Set real path for our zip to be saved to from the form
$rootPath = realpath($fname);
// If the zip is a single file
if ($direct_single == 'single') {
// Initialize archive object
$zip2 = new ZipArchive();
$zip2->open($folder_for_saving . $random_name_fin, ZipArchive::CREATE | ZipArchive::OVERWRITE);
// add the single file
$zip2->addFile($rootPath);
// Zip archive will be created only after closing object
$zip2->close();
// Send back the new file name for displaying
echo $random_name_fin;
}
// Create a zip file based on items in a directory
if ($direct_single == 'folder') {
// Initialize archive object
$zip = new ZipArchive();
$zip->open($folder_for_saving . $random_name_fin, ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($files as $name => $file) {
// Skip directories (they would be added automatically)
if (!$file->isDir()) {
// Get real and relative path for current file
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
// Add current file to archive
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();
// Return our created zip name
echo $random_name_fin;
}
} else {
// Update that our post did not include any data to us
return 'No details sent zip creation failed.';
}
?>
Это код Ajax для отправки формы
$(document).ready( function()
{
// Create download link
$('.asset_link').click(function ()
{
// this is the site to create a zip file of
var value = $(this).attr("data-link");
$.ajax({
type: "POST",
url: 'zip.php',
async:true,
data:{
'fname': value,
'ziptype': 'folder'
},
success: function(data){
// Update the modal to display the backup zip link
$("#linkz").html('<a href="mypath/'+data+'" >'+ data + '<\/a>');
jQuery("#myModal").modal('show');
},
timeout: 1000000,
});
});
});
Задача ещё не решена.
Других решений пока нет …