ajax — php создание zip файла, завершение или статус

Я создаю резервную систему 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,
});
});

});

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …