🢂💾 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:
- Ustawia limit czasu wykonania skryptu na 5 minut oraz limit pamięci na 1024 megabajty.
- Tworzy nazwę pliku zip na podstawie bieżącej daty.
- Tworzy nowy obiekt ZipArchive.
- Otwiera plik zip o nazwie utworzonej wcześniej.
- Definiuje funkcję
addFolderToZip
, która rekurencyjnie dodaje foldery i pliki do archiwum zip. - Wywołuje funkcję
addFolderToZip
rozpoczynając od bieżącego folderu. - Zamyka archiwum zip.
- 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:
- Rozszerzenie PHP ZipArchive:
- Musi być zainstalowane i aktywne w konfiguracji PHP. Możesz to sprawdzić za pomocą
phpinfo()
lubextension_loaded('zip')
.
- Musi być zainstalowane i aktywne w konfiguracji PHP. Możesz to sprawdzić za pomocą
- 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
).
- 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 (
- Właściwe ustawienie konfiguracji PHP:
- Odpowiednie ustawienia
max_execution_time
imemory_limit
wphp.ini
, aby zapewnić, że skrypt nie zostanie przerwany z powodu przekroczenia limitów czasu wykonania lub pamięci.
- Odpowiednie ustawienia
- 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
, ivendor
, 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.
- Lista zawiera nazwy plików i folderów, które mają być pomijane podczas tworzenia archiwum. W tym przypadku dodano
- 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.";
?>