source: spip-zone/_plugins_/migrateur/trunk/class/Serveur/Action/DumpDatabase.php @ 90831

Last change on this file since 90831 was 90831, checked in by marcimat@…, 4 years ago

Permettre de transmettre en option le nom de l'export désiré (nom_sauvegarde)
ainsi que les tables souhaitées exclusivement (tables) pour la création d'un dump.

à l'export dump.

File size: 4.8 KB
Line 
1<?php
2
3namespace SPIP\Migrateur\Serveur\Action;
4
5use Ifsnop\Mysqldump\Mysqldump;
6
7
8class DumpDatabase extends ActionBase {
9
10        /** Doit-on gziper le dump si la commande est disponible sur le serveur ? */
11        private $gzip_si_possible = true;
12
13        /** Doit-on utiliser mysqldump si disponible sur le serveur ? */
14        private $mysqldump_si_possible = true;
15
16        /** Nom du fichier de sauvegarde (sans extension) */
17        private $nom_sauvegarde = 'migrateur';
18
19        /** Tables à exporter (toutes si vide) */
20        private $tables = array();
21
22
23        public function run($data = null) {
24                $this->log_run("Get Database");
25
26                if (isset($data['gzip_si_possible'])) {
27                        $this->gzip_si_possible = (bool)$data['gzip_si_possible']; 
28                }
29
30                if (isset($data['mysqldump_si_possible'])) {
31                        $this->mysqldump_si_possible = (bool)$data['mysqldump_si_possible']; 
32                }
33
34                if (isset($data['nom_sauvegarde'])) {
35                        $this->nom_sauvegarde = $data['nom_sauvegarde']; 
36                }
37
38                if (isset($data['tables'])) {
39                        $this->tables = $data['tables']; 
40                }
41
42                spip_timer('dump database');
43
44                if (!$chemin = $this->makeDump()) {
45                        return "Echec de création du dump.";
46                }
47
48                $t = spip_timer('dump database');
49
50                include_spip('inc/filtres');
51                $taille = filesize($chemin);
52                $to = taille_en_octets($taille);
53                $file = substr($chemin, strlen($this->source->dir . DIRECTORY_SEPARATOR));
54
55                $this->log("Dump dans <em>$file</em>");
56                $this->log("  | $to en $t");
57
58                return array(
59                        'fichier' => substr($chemin, strlen(rtrim(realpath(_DIR_RACINE), '/') . '/')),
60                        'taille'  => $taille,
61                        'taille_octets' => taille_en_octets($taille),
62                        'duree' => $t,
63                        'hash'  => hash_file('sha256', $chemin)
64                );
65        }
66
67        /**
68         * Retourne le chemin absolu du fichier de sauvegarde
69         *
70         * Crée le sous répertoire tmp/dump au passage
71         *
72         * @return string
73        **/
74        private function getBackupPath() {
75                $file = 'tmp/dump/' . $this->nom_sauvegarde . '.sql';
76                sous_repertoire(_DIR_TMP . 'dump');
77                return $this->fichier = $this->source->dir . DIRECTORY_SEPARATOR . $file;
78        }
79
80
81        private function makeDump() {
82
83                $sauvegarde = $this->getBackupPath();
84
85                @unlink($sauvegarde);
86                @unlink("$sauvegarde.gz");
87
88                // mysqldump de préférences
89                $cmd = '';
90                if ($this->mysqldump_si_possible) {
91                        $cmd = $this->source->commande('mysqldump');
92                }
93
94                if ($cmd) {
95                #if (false) {
96                        return $this->makeMysqlDump($sauvegarde);
97                } else {
98                        return $this->makePhpDump($sauvegarde);
99                }
100        }
101
102        /**
103         * Fait une sauvegarde avec mysqldump
104         *
105         * @param string $sauvegarde Chemin du fichier sql de sauvegarde
106         * @return bool
107        **/
108        private function makeMysqlDump($sauvegarde) {
109
110                $cmd = $this->source->commande('mysqldump');
111                if (!$cmd) {
112                        $this->log("mysqldump introuvable");
113                        return false;
114                }
115
116                $this->log("Exécution de mysqldump…");
117
118                if ($this->tables) {
119                        $this->log("Sur tables : " . implode(", ", $this->tables));
120                }
121
122                $source = $this->source;
123
124                if ($source->sql->login_path) {
125                        $this->log("Connexion avec login-path : {$source->sql->login_path}");
126                        $identifiants = "--login-path={$source->sql->login_path}";
127                } elseif ($source->sql->user and $source->sql->pass) {
128                        $this->log("Connexion avec user (et mot de passe) : {$source->sql->user}");
129                        $identifiants = "-u {$source->sql->user} --password={$source->sql->pass}";
130                } else {
131                        $this->log("/!\ Erreur de connexion : aucun 'login-path' ou couple 'user/password' trouvés pour se connecter à la base de données.");
132                        return;
133                }
134
135                $output = "";
136
137                $gzip = false;
138                if ($this->gzip_si_possible) {
139                        $gzip = $source->obtenir_commande_serveur('gzip');
140                }
141
142                if ($gzip) {
143                        migrateur_log("Compression gz");
144                        $compression = "| $gzip";
145                        $_sauvegarde = "$sauvegarde.gz";
146                } else {
147                        migrateur_log("Sans compression");
148                        $compression = "";
149                        $_sauvegarde = "$sauvegarde";
150                }
151
152                $tables = implode(" ", $this->tables);
153                exec($commande = "$cmd $identifiants {$source->sql->bdd} $tables $compression > $_sauvegarde 2>&1", $output, $err);
154                # $this->log($commande);
155
156                if ($err) {
157                        $this->log("! Erreurs survenues : $err");
158                        if ($output) $this->log( implode("\n", $output) );
159                        return false;
160                } 
161
162                return $_sauvegarde;
163        }
164
165        /**
166         * Fait une sauvegarde mysql avec php
167         *
168         * @param string $sauvegarde Chemin du fichier sql de sauvegarde
169         * @return bool
170        **/
171        private function makePhpDump($sauvegarde) {
172                $this->log('makephpdump');
173                if ($this->tables) {
174                        $this->log("Sur tables : " . implode(", ", $this->tables));
175                }
176
177                $gz = function_exists("gzopen");
178
179                include_spip('lib/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump');
180
181                $dump = new Mysqldump(
182                        $this->source->sql->bdd,
183                        $this->source->sql->user,
184                        $this->source->sql->pass,
185                        $this->source->sql->serveur,
186                        $this->source->sql->req,
187                        array(
188                                'compress' => $gz ? Mysqldump::GZIP : Mysqldump::NONE,
189                                'include-tables' => $this->tables,
190                        )
191                );
192
193                if ($gz) {
194                        $sauvegarde .= '.gz';
195                }
196
197                $dump->start($sauvegarde);
198
199                return $sauvegarde;
200        }
201}
Note: See TracBrowser for help on using the repository browser.