2017-10-16 12 views
0

Comment est-ce que je peux faire ceci?Comment se connecter avec deux instances de base de données (avec quelques règles) (PHP PDO)

Les règles sont les suivantes:

  • peut exister deux bases de données (maître et esclave);
  • Peut exister une seule base de données (maître);
  • Si la requête est un SELECT et qu'un DB est disponible, la requête doit être exécutée sur un DB esclave.
  • Si la requête n'est pas un SELECT ou si le DB n'est pas disponible, la requête doit être exécutée sur la DB principale.

Quelques notes:

  • Les deux bases de données sont dans le même serveur
  • bases de données sont dans les ports différents
  • L'instance base de données $db doit être injecté dans d'autres classes ... mais quelle instance? Maître ou Esclave? Je ne sais pas encore si la requête sera un SELECT ou non.

Quelques doutes:

  • Ai-je besoin des instances 2 bases de données, non?
  • Dois-je étendre PDO préparer la méthode? Je pense que c'est une mauvaise pratique mais c'est mieux que rien.
+0

Vous pouvez vous connecter à deux bases de données mais en accéder une à la fois? J'ai peur, ce n'est pas possible si vous cherchez à accéder aux deux simultanément. – shashi

+0

@shashi la connexion peut être faite à une instance à la fois (je pense que j'ai besoin de deux instances). – SandroMarques

+0

Oui, faites deux objets de connexion et utilisez-les selon vos besoins – shashi

Répondre

0

Il n'y a pas un « hors de la boîte » fonction pour cela, mais vous devriez être en mesure de construire cela sans beaucoup de problèmes,

Créer une classe PHP qui fournira le comportement désiré. Il n'y a pas de limite sur le nombre de connexions à différentes bases de données.

Ainsi, votre classe doit initialiser 2 connexions DB voir (http://php.net/manual/en/pdo.construct.php)

Créer une fonction de lecture, et une fonction d'écriture. et assurez-vous que toutes les E/S de l'application ont lancé cette classe.

Pour vous assurer que vous n'avez pas besoin de vous reconnecter à chaque fois, je vous suggère de faire un singleton de votre classe. voir (https://en.wikipedia.org/wiki/Singleton_pattern)

votre classe ressemblera à quelque chose comme ça

<?php 

class DB { 

    protected static $instance = null; 
    protected $master; 
    protected $slave; 

    public static function getInstance() 
    { 
     if (!isset(static::$instance)) { 
      static::$instance = new static; 
     } 
     return static::$instance; 
    } 

    public __construct(){ 
     // init master and slave connection 
    } 

    public read($sql){ 
     // read slave 
     // if not exists read master 
    } 

    public write($sql){ 
     // write to master 
    } 

} 
?> 

Assurez-vous attrapez l'exception si la connexion n'est pas availible voir http://php.net/manual/en/language.exceptions.php

Hope this vous obtiendrez sur votre chemin

+0

Désolé @Tim Je n'ai pas compris. – SandroMarques

+0

Le point principal: si vous voulez le type de fonctionnalité que vous décrivez, vous devrez le construire.vous pouvez créer 2 connexions dans une instance. Si vous voulez utiliser la classe DB (comme dans l'exemple) n'importe où, vous pouvez juste faire quelque chose comme DB :: getInstance() -> read ("Select * from example") – Tim

+1

Si vous voulez avoir une réponse plus spécifique: share quelques exemples de code pour votre situation. – Tim