Libraire CodeIgniter 3 – Backup base de données

Selon nos projet, nous avons besoin par mesure de sécurité, pour un besoin de migration ou autres de faire simplement un backup complet de notre base de données !

Voici une libraire pour CodeIgniter 3 de réaliser cette opération de manière très simple ! L’avantage de cette lib c’est que vous pourrez configurer vos export avant autant de paramètres qu’avec un outils Gui (genre PhpMyAdmin).

Le résutlat ? Un fichier zip sur votre laptop avec toutes votre bdd !

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Db_backup {

    protected $CI;

    public function __construct() {
        $this->CI = &get_instance();
        $this->CI->load->dbutil();
        $this->CI->load->helper('file');
        $this->CI->load->library('zip');
    }

    public function backup($options = array()) {
        // Options par défaut
        $default_options = array(
            'format'              => 'zip',
            'filename'            => 'backup_' . date('Y-m-d-His') . '.zip',
            'tables'              => '*',
            'add_drop'            => TRUE,
            'add_insert'          => TRUE,
            'add_create_table'    => TRUE,
            'add_create_database' => FALSE,
            'add_drop_database'   => FALSE,
            'newline'             => "\n",
            'if_not_exists'       => FALSE,
            'encoding'            => 'utf8',
            'gzip_compression'    => FALSE
        );

        // Fusionner les options par défaut avec les options passées
        $backup_options = array_merge($default_options, $options);

        // Définir l'encodage de la base de données
        $this->CI->db->query("SET NAMES '".$backup_options['encoding']."'");

        // Obtenir la liste des tables dans la base de données
        $tables = $this->CI->db->list_tables();

        // Vérifier si toutes les tables doivent être sauvegardées ou seulement certaines
        if ($backup_options['tables'] !== '*') {
            $tables = array_intersect($tables, (array) $backup_options['tables']);
        }

        // Créer le contenu de la sauvegarde pour chaque table
        $content = '';
        foreach ($tables as $table) {
            $content .= $this->CI->dbutil->backup(array(
                'tables'              => array($table),
                'add_drop'            => $backup_options['add_drop'],
                'add_insert'          => $backup_options['add_insert'],
                'add_create_table'    => $backup_options['add_create_table'],
                'add_create_database' => $backup_options['add_create_database'],
                'add_drop_database'   => $backup_options['add_drop_database'],
                'newline'             => $backup_options['newline'],
                'if_not_exists'       => $backup_options['if_not_exists']
            ));
        }

        // Vérifier le format de sauvegarde
        if ($backup_options['format'] === 'zip') {
            // Ajouter la sauvegarde à l'archive ZIP
            $this->CI->zip->add_data('backup.sql', $content);

            // Créer le fichier ZIP
            $this->CI->zip->archive($backup_options['filename']);

            // Télécharger le fichier ZIP
            $this->CI->zip->download($backup_options['filename']);
        } else {
            // Créer le fichier de sauvegarde
            write_file($backup_options['filename'], $content);

            // Vérifier si la compression Gzip est activée
            if ($backup_options['gzip_compression']) {
                // Créer une version compressée du fichier de sauvegarde
                $this->compress_gzip($backup_options['filename']);
            }
        }
    }

    protected function compress_gzip($filename) {
        // Vérifier si l'extension zlib est disponible
        if (extension_loaded('zlib')) {
            // Lire le contenu du fichier
            $content = file_get_contents($filename);

            // Compresser le contenu avec Gzip
            $compressed_content = gzencode($content, 9);

            // Écrire le contenu compressé dans un nouveau fichier
            $compressed_filename = $filename . '.gz';
            write_file($compressed_filename, $compressed_content);
        }
    }

}

Voici les paramètre disponibles :

  • format : Le format de sauvegarde souhaité. Actuellement, seule la sauvegarde au format ZIP est prise en charge.
  • filename : Le nom du fichier de sauvegarde.
  • tables : Les tables à sauvegarder. Par défaut, toutes les tables sont sauvegardées.
  • add_drop : Ajouter les instructions DROP TABLE dans la sauvegarde. Par défaut : TRUE.
  • add_insert : Ajouter les instructions INSERT INTO dans la sauvegarde. Par défaut : TRUE.
  • add_create_table : Ajouter les instructions CREATE TABLE dans la sauvegarde. Par défaut : TRUE.
  • add_create_database : Ajouter les instructions CREATE DATABASE dans la sauvegarde. Par défaut : FALSE.
  • add_drop_database : Ajouter les instructions DROP DATABASE dans la sauvegarde. Par défaut : FALSE.
  • newline : Le caractère de nouvelle ligne à utiliser dans la sauvegarde. Par défaut : “\n”.
  • if_not_exists : Utiliser l’instruction IF NOT EXISTS lors de la création des tables. Par défaut : FALSE.
  • encoding : L’encodage à utiliser pour la sauvegarde. Par défaut : ‘utf8’.
  • gzip_compression : Activer la compression Gzip pour le fichier de sauvegarde. Par défaut : FALSE.

Et voici comment l’utiliser !

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Backup extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->library('db_backup');
    }

    public function index() {
        // Options de sauvegarde
        $backup_options = array(
            'format'              => 'zip',
            'filename'            => 'backup_' . date('Y-m-d-His') . '.zip',
            'tables'              => '*', // Sauvegarder toutes les tables
            'add_drop'            => TRUE,
            'add_insert'          => TRUE,
            'add_create_table'    => TRUE,
            'add_create_database' => FALSE,
            'add_drop_database'   => FALSE,
            'newline'             => "\n",
            'if_not_exists'       => FALSE,
            'encoding'            => 'utf8',
            'gzip_compression'    => FALSE
        );

        // Effectuer la sauvegarde
        $this->db_backup->backup($backup_options);
    }

}

Voilà ! Faites en un bon usage 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *