Ver Mensaje Individual
  #6 (permalink)  
Antiguo 16/06/2019, 18:27
Avatar de kahlito
kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 9 meses
Puntos: 65
Respuesta: Optimizar y reducir el número de conexiones a la base de datos

Hola Triby

He realizado solo un pequeño cambio en tu código y parece que va perfecto:

Código PHP:
Ver original
  1. // // Facilita el manejo extendiendo de PDO
  2. class DBmysql extends PDO {
  3. //class DBmysql extends Conexion {
  4.     // Crea solo una instancia de la clase (patrón Singleton)
  5.     private static $_instance = false;
  6.  
  7.     public static function conectar() {
  8.         // Verificar si no se ha realizado la conexión
  9.         if(self::$_instance === false) {
  10.             // Conectamos a la base de datos
  11.             try {
  12.                 // Verifica que los parámetros son correctos, tomé el código de otra clase
  13.                 self::$_instance = new PDO("mysql:host=localhost;dbname=nombrebd",
  14.                         "root",
  15.                         "",
  16.                         array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  17.                               PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
  18.                         );
  19.  
  20.                 //Intento ver en el código fuente las actuales conexiones a la BD.
  21.                 echo "Acabo de conectarme FW";
  22.  
  23.             } catch (PDOException $e) {
  24.                 // Hay que elaborar mejor el manejo de errores, esto solo es ejemplo
  25.                 die('No se puede establecer una conexión a base de datos.');
  26.             }
  27.         }
  28.         return self::$_instance;
  29.     }
  30. }

Luego por ejemplo en el modelo de subcategorías solo cambio Conexion por DBmysql y listo:

Código PHP:
Ver original
  1. /*=============================================
  2. MOSTRAR SUB-CATEGORÍAS SINGLETON
  3. =============================================*/
  4.  
  5.     static public function mdlMostrarSubCategorias($tabla, $item, $valor){
  6.  
  7.                 $stmt = DBmysql::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item");
  8.  
  9.         $stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);
  10.  
  11.         $stmt -> execute();
  12.  
  13.         return $stmt -> fetchAll();    
  14.  
  15.         $stmt -> close();
  16.  
  17.         $stmt = null;
  18.  
  19.     }
Por lo que veo ahora al aplicar este nuevo método reduce en gran cantidad el número de conexiones a la base de datos, pero no estoy seguro del todo si lo estoy haciendo de la manera correcta tanto en ver cuantas conexiones hago por página y también en como lo estoy aplicando al código actual.

¿Estoy en lo correcto como lo estoy haciendo ahora?

He visto incluso que si por ejemplo también añado $stmt = DBmysql::conectar() a otros funciones dentro del mismo modelo (productos-modelo.php) por ejemplo en categorías o en listar productos o cualquier otra zona que en total solo aparece 1 conexión.

Por ejemplo aquí aplico el mismo cambio para categorías.

Código PHP:
Ver original
  1. /*=============================================
  2.     MOSTRAR CATEGORÍAS
  3.     =============================================*/
  4.  
  5.     static public function mdlMostrarCategorias($tabla, $item, $valor){
  6.  
  7.         if($item != null){          
  8.  
  9.             $stmt =  DBmysql::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item");          
  10.  
  11.             $stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);
  12.  
  13.             $stmt -> execute();
  14.  
  15.             return $stmt -> fetch();        
  16.  
  17.  
  18.         }else{            
  19.  
  20.             $stmt =  DBmysql::conectar()->prepare("SELECT * FROM $tabla");
  21.  
  22.             $stmt -> execute();
  23.  
  24.             return $stmt -> fetchAll();        
  25.  
  26.         }
  27.        
  28.         $stmt -> close();
  29.  
  30.         $stmt = null;
  31.  
  32.     }

Con este cambio entonces aunque me conecto ya más de una vez en total me da 1 conexión.

Me pregunto entonces que si también cambio todas las anteriores consultas de $stmt = Conexion:: al nuevo $stmt = DBmysql:: , ¿sería posible dejar solo 1 conexión por página en total o es mejor aplicar dicha esta nueva opción solo en algunas zonas concretas del proyecto que generen varias conexiones a la vez como por ejemplo sería subcategorías, listado de productos etc etc? Es decir o meter en todas $stmt = DBmysql:: o solo cambiarla en zonas que generen varias consultas a la base de datos y en el resto mantener la anterior de $stmt = Conexion::

Espero no haber liado mucho la pregunta...

Por cierto, supongo que conoces este ejemplo, comentar que también me recomendaron hacer algo parecido siguiendo este enlace:

https://gist.github.com/ftonato/2973...a48804dcdb71dd

Sin embargo creo que tu ejemplo se adapta y me facilita más el trabajo al proyecto actual.

Gracias por tu gran ayuda.

Saludos.