source: spip-zone/_plugins_/migrateur/dev-by-http/class/Serveur/Action/DumpDatabase.php @ 88469

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

Pouvoir indiquer qu'on ne veut pas utiliser mysqldump pour une sauvegarde.

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