1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
<?php
// controller/backup.php
// note: faire que cette fonction soit exécutée automatiquement de temps en temps
function sauvegarder($from)
{
$title = 'extraction des données';
$cheminDestination = "data/";
$date = date("d-m-Y", time());
$nomFichier = "melaineDATA_" . $date;
// ne prendre que les dossiers pour exclure les fichiers password.txt, melaineDATA.zip et melainePHP.zip existant
$dossiersCibles = [ 'data/archives', 'data/concerts', 'data/liens', 'data/presse', 'data/ateliers', 'data/discographie', 'data/melaine', 'data/peinture' ];
//$fichiersALaRacine = [];
createZip($cheminDestination, $nomFichier, $dossiersCibles);
global $archiveFormat;
$nomFichier = $nomFichier . '.' . $archiveFormat;
require('view/backup.php');
}
function creerMelainePHP()
{
$cheminDestination = 'data/';
$nomFichier = "melainePHP";
// tous les dossiers sauf data et .git
$dossiersCibles = ['model', 'view', 'controller', 'public', 'lib'];
$fichiersALaRacine = ['*.php', '.htaccess', '*.txt']; // robots?
createZip($cheminDestination, $nomFichier, $dossiersCibles, $fichiersALaRacine);
}
// les deux premiers paramètres concernent le fichier créé
// le quatrième est optionnel et concerne les fichiers à la racine
function createZip($destinationPath, $zipFileName, array $targetDirectories, array $allPattern = [])
{
global $archiveFormat; // choix du format
$zipFileName = $zipFileName . '.' . $archiveFormat;
try
{
$Zip = new ZipArchive();
}
catch (Throwable $e) // l'extension zip n'est pas activée
{
echo($e);
die();
}
// note: j'ai utilisé l'option ZipArchive::OVERWRITE,
// ZipArchive::FL_OVERWRITE n'apparaît qu'avec PHP 8
if ($Zip->open($destinationPath . $zipFileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE)
{
exit("Impossible de créer ou d'ouvrir ou créer le fichier <i>data/" . $zipFileName . ".</i><br />
Il est possible que ce fichier existe déjà et soit interdit en écriture.<br />
<p><a href=\"index.php\" >Retour au site</a></p>");
}
$compteur = 0;
// recherche récursive dans les dossiers dans $directories
foreach($targetDirectories as $path)
{
// les deux lignes suivantes reviennent à utiliser le paramètre "-r" dans la console
$directory = new RecursiveDirectoryIterator($path);
$iterator = new RecursiveIteratorIterator($directory);
foreach ($iterator as $info)
{
// chemins inutiles . et ..
if($info->getFilename() != "." && $info->getFilename() != "..")
{
$Zip->addGlob($info->getPathname(), 0, array(''));
$compteur++;
}
}
}
// recherche à la racine avec des pattern de noms de fichiers
// possibilité d'un tableau vide (paramètre optionnel)
foreach($allPattern as $onePattern)
{
$Zip->addGlob($onePattern, 0, array(''));
}
$Zip->close();
if($compteur > 0)
{
chmod($destinationPath . $zipFileName, 0666); // en octal
}
else
{
$_SESSION['erreur'] = "Extraction des données impossible, le site entier est vide.";
}
}
function restaurer($from)
{
$title = 'Restauration des données';
$message = '';
// recharger la même page en écrivant les données
if(isset($_FILES['archive']) && $_FILES['archive']['error'] == 0)
{
// détecter le format (zip ou autre)
// une copie du zip est conservée dans data/ au cas où
move_uploaded_file($_FILES['archive']['tmp_name'], 'data/' . $_FILES['archive']['name']);
chmod('data/' . $_FILES['archive']['name'], 0666);
$nomFichier = 'data/' . $_FILES['archive']['name'];
// extraction
try
{
$Zip = new ZipArchive();
}
catch (Throwable $e) // l'extension zip n'est pas activée
{
echo($e);
die();
}
if($Zip->open($nomFichier, ZipArchive::RDONLY) === TRUE)
{
$j = 0;
for($i = 0; $i < $Zip->numFiles; $i++)
{
$nomEntree = $Zip->getNameIndex($i);
if($Zip->extractTo('.', $nomEntree) === TRUE)
{
$j++;
}
else
{
$message = '<p style="color: red;" >Erreur: extraction du zip impossible.</p>';
}
chmod($nomEntree, 0666);
}
if($j == $Zip->numFiles)
{
$message = '<p style="color: red;" >Restauration réussie !!</p>';
}
$Zip->close();
}
else
{
// mauvais fichier
$message = '<p style="color: red;" >Erreur: Impossible d\'ouvrir l\'archive Zip."</p>';
}
}
elseif(isset($_FILES['archive']) && $_FILES['archive']['error'] != 0)
{
$message = '<p style="color: red;" >Erreur: Le fichier n\'a pas pu être téléchargé correctement."</p>';
}
require('view/backup.php');
}
|