Mettre en place un système de serveur maître et esclaves sous Prestashop

Salut à tous !

Au programme de cet article : mettre en place un système de serveurs maître/esclaves correct sous Prestashop. Pourquoi je précise correct ? Tout simplement car ma solution fait en sorte que même lors d’une maj Prestashop, vous n’aurez rien à refaire pour que votre système de serveur maître/esclaves fonctionne (sauf changement de fonctionnement dans Prestashop bien sûr ^^’).

Les fichiers concernés :

  • /config/settings.inc.php => modification
  • /classes/db/Db.php => on va utiliser l’override (Pour plus d’information sur l’override, cliquez-ici)
  • /override/classes/db/Db.php => modification

Comment on va faire ? On va commencer par adapter LE seul fichier de config qui n’est pas modifié en cas de mise à jour de prestashop, je parle ici du fichier /config/settings.inc.php pour y préciser via une constante que l’on veut exploiter des serveurs maître/esclaves et on va également y préciser l’adresse d’un serveur esclave en partant du principe que les deux serveurs ont les mêmes identifiants (pour gagne en code, à vous d’adapter si ce n’est pas le cas ^^). Voici donc le code du fichier /config/settings.inc.php :

<?php
// Cette constante permet d'activer l'utilisation des serveurs maître/esclaves
define('_PS_USE_SQL_SLAVE_', 1);
// On définit l'adresse du serveur esclave
define('_DB_SERVER_SLAVE_', 'adresse-serveur-esclave');
// On définit l'adresse du serveur maître
define('_DB_SERVER_', 'adresse-serveur-maitre');
// On définit les identifiants pour les BD maître et esclaves (identifiants identiques)
define('_DB_NAME_', 'nom_bd');
define('_DB_USER_', 'identifiant_bd');
define('_DB_PASSWD_', 'mdp_bd');
// le reste du code ne nous concerne pas

Ensuite, on va exploiter le système d’override de Prestashop qui permet de surcharger des classes/controllers en les plaçant dans le dossier /override de votre projet. Du coup pas besoin de modifier le fichier /classes/db/Db.php, on va directement modifier (ou créer s’il n’existe pas) le fichier /override/classes/db/Db.php. Dans ce fichier, on va créer une classe qui se nomme Db et qui va étendre DbCore. Ensuite c’est tout simple, on va préciser une variable pour n’ajouter qu’une seule fois le serveur esclave à la liste des serveurs à utiliser. Puis on redéfinit la méthode __construct() pour que dès qu’on instancie un élément Db et qu’on n’a pas encore ajouté le serveur esclave, on modifie la variable $_servers de DbCore pour lui ajouter le serveur esclave. Voici le code du fichier /override/classes/db/Db.php :

<?php
/**
* Rev 0.01 du 2013/04/03 :
* - Correctif du bug lors de l'ajout de produits
* - Passage de la variable $ajout_server_ok en variable static
**/
abstract class Db extends DbCore
{
/**
* Via cette variable, on va éviter d'ajouter plusieurs fois le serveur esclave
* @var: bool $ajout_server_ok
**/
private static $ajout_server_ok = false;
/**
* On redéfinit la méthode __construct() du parent pour lui ajouter les serveurs
* @param string $server Server address
* @param string $user User login
* @param string $password User password
* @param string $database Database name
* @param bool $connect If false, don't connect in constructor (since 1.5.0)
*/
public function __construct($server, $user, $password, $database, $connect = true)
{
// Si jamais l'ajout du serveur esclave n'a pas encore été fait
if(! self::$ajout_server_ok){
// on ajoute le serveur esclave à la liste des serveurs
parent::$_servers[] = array('server' => _DB_SERVER_SLAVE_,
'user' => _DB_USER_,
'password' => _DB_PASSWD_,
'database' => _DB_NAME_); /* MySQL Slave server */
// On modifie la variable pour éviter de refaire l'ajout du serveur esclave
self::$ajout_server_ok = true;
}
// On lance le constructeur par défaut pour que tout fonctionne bien :p
parent::__construct($server, $user, $password, $database, $connect);
}
}
view raw Db.php hosted with ❤ by GitHub

Et voilà ! c’est fini et normalement tout fonctionne bien. Prestashop gère lui même le fait de savoir si on doit ou non utiliser le serveur maître ou esclave en fonction des cas de figure.

C’est la fin de ce petit tuto sur Prestashop qui entame sûrement une future série sur ce CMS étant donné que je suis en train de travailler avec cet outil et que je rencontre beaucoup de soucis dont je trouve rarement les réponses sur le net (ou difficilement).

Vous aimerez aussi...

Laisser un commentaire

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