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

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

Lorsqu'on affiche les logs du serveur au fur et à mesure en js, n'afficher que l'heure, c'est suffisant.

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