Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/09/2011, 07:05
Avatar de h2swider
h2swider
 
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Singleton, para conexion a BD

En mi sitio estoy implementando singleton para conectarme a una base oracle, pero como realmente no tengo mucha experiencia con este patrón, ¿Como podría asegurarme que realmente se esta generando una sola conexión?
Hasta ahora puedo ver que siempre me trae un source, pero no se si siempre es el mismo

Últimamente se cuelga por momentos el apache y sospecho que puede ser esta clase la que genera el problema.

De paso, si es que esta razonablemente bien, podría servir como aporte, cambiándole el oci_connect, por un mysql o cualquier otro, sirve para cualquier motor.

Código PHP:
<?php

/**
 * Clase de conexion
 * Implementada con patron de diseño singleton
 *
 * @author leswider
 */
class Conexion {

    private 
$_oLinkId//objeto resource que indicara si se ha conectado
    
private $_sServidor;
    private 
$_sNombreBD;
    private 
$_sUsuario;
    private 
$_sClave;
    private 
$_sPuerto;
    public static 
$sMensaje;
    private static 
$_oSelf null//Almacenara un objeto de tipo Conexion
    
    /**
     * 
     * @param string Nombre del usuario a conectarse.
     * @param string Password de conexión.
     * @param string Nombre de la base de datos.
     * @param string Nombre del servidor.
     */
    
private function __construct($user$pass$base$servidor) {
        
$this->_sServidor $servidor;
        
$this->_sNombreBD $base;
        
$this->_sUsuario $user;
        
$this->_sClave $pass;
        
$this->_sPuerto PUERTO;
        
$this->sMensaje "";
    }

    
/**
     * Este es el pseudo constructor singleton
     * Comprueba si la variable privada $_oSelf tiene un objeto
     * de esta misma clase, si no lo tiene lo crea y lo guarda
     * @static
     * @param string Nombre del usuario a conectarse (Por defecto la constante NOMBRE del archivo conf.inc.php)
     * @param string Clave de conexión. (Por defecto la constante PASSWORD del archivo conf.inc.php)
     * @param string Nombre de la base de datos (Por defecto la constante BASE del archivo conf.inc.php)
     * @param string Nombre del servidor (Por defecto la constante SERVIDOR del archivo conf.inc.php)
     * @return resource
     */
    
public static function getInstancia($user USUARIO$pass PASSWORD$base BASE$servidor SERVIDOR) {

        if (!
self::$_oSelf instanceof self) {
            
$instancia = new self($user$pass$base$servidor); //new self ejecuta __construct()
            
self::$_oSelf $instancia;
            if (!
is_resource($instancia->conectar())) {
                
self::$_oSelf null;
            }
        }
        
$conex self::$_oSelf;
        return 
$conex->_oLinkId//Se devuelve el link a la conexion
    
}

    
/**
     * Realiza la conexion
     * @return link para exito, o false
     */
    
private function conectar() {

        
$this->_oLinkId = @oci_connect($this->_sUsuario$this->_sClave"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" $this->_sServidor ")(PORT=" $this->_sPuerto "))(CONNECT_DATA=(SERVICE_NAME=" $this->_sNombreBD ")))");
        if (
is_resource($this->_oLinkId)) {
            
self::$sMensaje "Conexion exitosa!";
        } else {
            
self::$sMensaje "ERROR: No se puede conectar a la base de datos..!";
        }
        return 
$this->_oLinkId;
    }

    
/**
     * Este método verifica si había una conexión abierta anteriormenete. Si había la cierra.
     * 
     * @static
     * @return boolean true si existía la conexión, false si no existía.
     */
    
public static function desconectar() {

        
$conexion_activa false;
        if (
self::$_oSelf instanceof self) {
            
$bandera true;
            
$instancia self::$_oSelf;
            
oci_close($instancia->_oLinkId); //cierro la conexion activa
            
self::$_oSelf null//destruyo el objeto
        
}
        return 
$conexion_activa;
    }

}

?>
Código PHP:
if(is_source(Conexion::getInstancia())){
    echo 
"tengo un source";
} else {
    echo 
"error";
}
Conexion::desconectar
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives