Conexión a más de una base con múltiple instancias y servidores (red local)

Tema en 'Mods' iniciado por kriollo, el 27 Feb 2018.

  1. kriollo

    kriollo New Member

    Registrado:
    30 Sep 2017
    Mensajes:
    29
    Me Gusta recibidos:
    6
    Puntos de trofeo:
    3
    Género:
    Masculino
    Profesión:
    Ingenierio en Redes e Informática
    País:
    Chile
    Página Inicial:
    Nombre: Conexión a más de una base con múltiple instancias y servidores (red local)
    Versión: v2.0.x

    Después de muchas pruebas y errores logré hacerlo, les dejo los pasos para quien lo necesite.

    en el archivo de configuración creé un nuevo apartado de database, de la siguiente manera:
    PHP:
    database2:
      
    hostOtroServerEnRed
      user
    root
      pass
    :
      
    namedatabase2
      port
    1521
      protocol
    TCP
      motor
    mysql


    en el archivo DBModel.php
    PHP:
    //variable para uso de segunda base de datos
    protected $db2 null;


    // reemplazar en la función setDatabaseConfig
    $this->databaseConfig['name'] = $config['database']['name'];
                
    $this->databaseConfig['motor'] = $config['database']['motor'];
                
    $this->databaseConfig['new_instance'] = false;
    //por esto
           
    if ($databaseConfig null){           
                
    $this->databaseConfig['name'] = $config['database']['name'];
                
    $this->databaseConfig['motor'] = $config['database']['motor'];
                
    $this->databaseConfig['new_instance'] = false;
            }else{
                
    $this->databaseConfig['name'] = $databaseConfig['name'];
                
    $this->databaseConfig['motor'] = $databaseConfig['motor'];
                
    $this->databaseConfig['new_instance'] = true;
            }



    /**
         * Constructor inicial del modelo. conexión segunda base de datos
         *
         * @param array|null $databaseConfig: Configuración de conexión con base de datos con la forma
         *     'name' => string, # Nombre de la base de datos
         *     'motor' => string, # Motor de la base de datos
         *     'new_instance' => bool, # Establecer nueva instancia distinta a alguna ya existente
         */
    protected function startDB2Conexion($databaseConfig null) {
            
    # Llenar la configuración a la base de datos (la verdad no sé si es necesario pero lo mantuve para seguir con la estructura del framework)
            
    $this->setDatabaseConfig($databaseConfig);

            
    # Instancia a la base de datos
            
    $this->db2 Database::Start(
                
    $this->databaseConfig['name'],
                
    $this->databaseConfig['motor'],
                
    $this->databaseConfig['new_instance'],
                
    $databaseConfig
            
    );
        }

    // agregar a la función endDBConexion
    $this->db2 null;

    En el archivo Database.php
    PHP:
    //modificar función Start
    ,
    final public static function 
    Start($name null$motor nullbool $new_instance false$newdatabase null ) : Database {
        if (
    $newdatabase == null){
            global 
    $config;
            if (!
    self::$inst instanceof self or $new_instance) {
              
    self::$inst = new self(
                  
    null === $name $config['database']['name'] : $name,
                  
    null === $motor $config['database']['motor'] : $motor,
                  
    null
                
    );
            }
        }else{
            if (!
    self::$inst instanceof self or $new_instance) {
              
    self::$inst = new self(
                  
    null === $name $newdatabase['name'] : $name,
                  
    null === $motor $newdatabase['motor'] : $motor,
                  
    $newdatabase
                
    );
            }
        }

        return 
    self::$inst;
      }

    // en la funcion __construct(string $name, string $motor,$conexion) //se agrega paramentro $conexion
    //modificar apartado mysql, debe quedar asi
    case 'mysql':
                if (
    false == $conexion){
                    
    parent::__construct('mysql:host='.$config['database']['host'].';dbname='.$name,
                    
    $config['database']['user'],
                    
    $config['database']['pass'],
                    
    array_merge(array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'),$comun_config));
                }else{
                    
    parent::__construct('mysql:host='.$conexion['host'].';dbname='.$name,
                    
    $conexion['user'],
                    
    $conexion['pass'],
                    
    array_merge(array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'),$comun_config));
                }



    Ahora se puede llamar desde cualquier modelo de la siguiente manera

    PHP:

    $this
    ->startDB2Conexion($config['database2']);
    return 
    $this->db2->select($select,'users',$filtro);



    Si tienen otra forma de hacerlo más limpio, les agradeceré su aporte, yo puedo mejorarlo para dejarlo estándar en el framework, pero por tiempo,comodidad y como me funciona, lo dejaré así no más, saludos.

    atte.
    Jorge -> Kriollo
     

Compartir esta página