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;