/dev/null"); return !empty($check); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { header('Content-Type: application/json'); $action = $_POST['action'] ?? ''; if ($action === 'init') { $filename = 'backup_' . date("Ymd_His"); $response = ['success' => false]; if (canUseShell()) { if (commandAvailable('tar')) { $tarName = "$filename.tar"; shell_exec("tar -cf $tarName ."); if (file_exists($tarName)) { $response = [ 'success' => true, 'method' => 'shell_tar', 'file' => $tarName ]; echo json_encode($response); exit; } } elseif (commandAvailable('zip')) { $zipName = "$filename.zip"; shell_exec("zip -r $zipName . -x '*backup_*.zip' '*.git*' 'node_modules/*' 'vendor/*'"); if (file_exists($zipName)) { $response = [ 'success' => true, 'method' => 'shell_zip', 'file' => $zipName ]; echo json_encode($response); exit; } } } // Jeśli nie ma shell_exec lub zip/tar — fallback na ZipArchive krok po kroku $zipName = "$filename.zip"; $zipPath = __DIR__ . '/' . $zipName; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator(__DIR__, RecursiveDirectoryIterator::SKIP_DOTS) ); $files = []; foreach ($iterator as $file) { $path = $file->getPathname(); if (strpos($path, $zipName) !== false) continue; $files[] = $path; } $zip = new ZipArchive(); if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) { echo json_encode(['success' => false, 'message' => 'Nie można utworzyć ZIP']); exit; } $zip->addEmptyDir('__INIT__'); $zip->close(); file_put_contents(TMP_FILE, json_encode([ 'method' => 'php_zip', 'files' => $files, 'index' => 0, 'zipfile' => $zipPath, 'zipname' => $zipName ])); echo json_encode([ 'success' => true, 'method' => 'php_zip' ]); exit; } if ($action === 'step') { if (!file_exists(TMP_FILE)) { echo json_encode(['success' => false, 'message' => 'Brak danych tymczasowych']); exit; } $data = json_decode(file_get_contents(TMP_FILE), true); $files = $data['files']; $index = $data['index']; $zipfile = $data['zipfile']; $zipname = $data['zipname']; $zip = new ZipArchive(); if ($zip->open($zipfile) !== true) { echo json_encode(['success' => false, 'message' => 'Nie można otworzyć ZIP']); exit; } $end = min($index + FILES_PER_STEP, count($files)); for ($i = $index; $i < $end; $i++) { $filePath = $files[$i]; if (is_file($filePath)) { $localname = substr($filePath, strlen(__DIR__) + 1); $zip->addFile($filePath, $localname); } } $zip->close(); $data['index'] = $end; file_put_contents(TMP_FILE, json_encode($data)); $progress = $end / count($files); echo json_encode([ 'success' => true, 'method' => 'php_zip', 'progress' => round($progress * 100, 2), 'done' => $end >= count($files), 'zipfile' => $zipname ]); exit; } } ?>