🢂💾 Backup ‑ uniwersalna kopia serwisu w PHP

Pakuje bieżący katalog i podkatalogi do pliku ZIP

W skrócie, kod ten służy do spakowania zawartości bieżącego katalogu i podkatalogów do pliku zip.

Ten fragment kodu:

  1. Ustawia limit czasu wykonania skryptu na 5 minut oraz limit pamięci na 1024 megabajty.
  2. Tworzy nazwę pliku zip na podstawie bieżącej daty.
  3. Tworzy nowy obiekt ZipArchive.
  4. Otwiera plik zip o nazwie utworzonej wcześniej.
  5. Definiuje funkcję addFolderToZip, która rekurencyjnie dodaje foldery i pliki do archiwum zip.
  6. Wywołuje funkcję addFolderToZip rozpoczynając od bieżącego folderu.
  7. Zamyka archiwum zip.
  8. Wyświetla komunikat "Archiwum zostało utworzone.".

Ogólnie, ten fragment kodu służy do rekurencyjnego dodawania folderów i plików do archiwum zip w języku PHP.

Ważne:

  1. Rozszerzenie PHP ZipArchive:
    • Musi być zainstalowane i aktywne w konfiguracji PHP. Możesz to sprawdzić za pomocą phpinfo() lub extension_loaded('zip').
  2. Dostęp do systemu plików:
    • Skrypt musi mieć odpowiednie uprawnienia do czytania plików i katalogów, które ma spakować, oraz do zapisu w lokalizacji, gdzie ma być zapisany plik zip (chmod).
  3. Właściwe ustawienie konfiguracji PHP:
    • Odpowiednie ustawienia max_execution_time i memory_limit w php.ini, aby zapewnić, że skrypt nie zostanie przerwany z powodu przekroczenia limitów czasu wykonania lub pamięci.
  4. Lista wykluczeń ($exclusions):
    • Lista zawiera nazwy plików i folderów, które mają być pomijane podczas tworzenia archiwum. W tym przypadku dodano .env, node_modules, i vendor, które często zawierają pliki konfiguracyjne, zależności projektów Node.js lub biblioteki PHP, których archiwizacja może być niepożądana.
  5. Modyfikacja funkcji addFolderToZip:
    • Funkcja sprawdza, czy plik lub folder znajduje się na liście wykluczeń przed jego dodaniem do archiwum. Umożliwia to ominięcie plików konfiguracyjnych, zależności, a także innych niechcianych elementów.
<?php
ini_set('max_execution_time', 300); // Ustawienie limitu czasowego na 5 minut
ini_set('memory_limit', '512M'); // Ustawienie limitu pamięci na 512 megabajtów

$zip = new ZipArchive();
$filename = "./all_files_" . date("Y-m-d") . ".zip"; // Dodanie daty utworzenia do nazwy pliku

if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
    exit("Nie można otworzyć <$filename>\n");
}

$exclusions = ['.', '..', '.env', 'node_modules', 'vendor']; // Lista wykluczeń

// Funkcja rekurencyjna do dodawania folderów do archiwum zip
function addFolderToZip($dir, $zipArchive, $zipdir = '', $exclusions = []){
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            // Dodaj folder do archiwum
            if(!empty($zipdir) && !in_array(basename($dir), $exclusions)) {
                $zipArchive->addEmptyDir($zipdir);
            }

            // Przechodzenie przez pliki i foldery wewnątrz
            while (($file = readdir($dh)) !== false) {
                if(!in_array($file, $exclusions)){
                    if (is_file($dir . $file)) {
                        // Dodaj plik do archiwum
                        $zipArchive->addFile($dir . $file, $zipdir . $file);
                    } elseif (is_dir($dir . $file)) {
                        // Rekurencyjne dodawanie folderów
                        addFolderToZip($dir . $file . '/', $zipArchive, $zipdir . $file . '/', $exclusions);
                    }
                }
            }
            closedir($dh);
        }
    }
}

// Rozpoczęcie od bieżącego folderu
addFolderToZip('./', $zip, '', $exclusions);

$zip->close();
echo "Archiwum zostało utworzone.";
?>