Foros del Web » Programando para Internet » PHP »

Optimizar y reducir el número de conexiones a la base de datos

Estas en el tema de Optimizar y reducir el número de conexiones a la base de datos en el foro de PHP en Foros del Web. Buenas. Estoy haciendo un proyecto bastante extenso donde sigo un modelo con PDO y MVC donde en algunas de las páginas que cargan superamos las ...
  #1 (permalink)  
Antiguo 11/06/2019, 12:58
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.913
Antigüedad: 16 años, 3 meses
Puntos: 61
Optimizar y reducir el número de conexiones a la base de datos

Buenas.

Estoy haciendo un proyecto bastante extenso donde sigo un modelo con PDO y MVC donde en algunas de las páginas que cargan superamos las 25 conexiones a la base de datos y por lo tanto da problemas de conexión con el servidor actual que tenemos ya que tiene fijado ese límite de conexiones y me gustaría saber si alguna posibilidad de reducir las consultas las conexiones actuales ya que sino tendremos que cambiar a un servidor dedicado.

Por ejemplo utilizando este módulo en concreto para categorías que cargan en el menú salen 5 conexiones.

cabezote.php

Código PHP:
<!--=====================================
CATEGORÍAS
======================================-->

        <div class="col-xs-12 backColor" id="categorias">

            <?php

                $item 
null;
                
$valor null;

                
$categorias ControladorProductos::ctrMostrarCategorias($item$valor);

                foreach (
$categorias as $key => $value) {

                    echo 
'<div class="col-lg-2 col-md-3 col-sm-4 col-xs-12">
                            
                            <h4>
                                <a href="'
.$url.$value["ruta"].'" class="pixelCategorias">'.$value["categoria"].'</a>
                            </h4>
                            
                            <hr>

                            <ul>'
;

                            
$item "id_categoria";

                            
$valor $value["id"];

                            
$subcategorias ControladorProductos::ctrMostrarSubCategorias($item$valor);
                            
                            foreach (
$subcategorias as $key => $value) {
                                    
                                    echo 
'<li><a href="'.$url.$value["ruta"].'" class="pixelSubCategorias">'.$value["subcategoria"].'</a></li>';
                                }    
                                
                            echo 
'</ul>

                        </div>'
;
                }

            
?>    

        </div>

    </div>
productos-controlador.php

Código PHP:
<?php

class ControladorProductos{

    
/*=============================================
    MOSTRAR CATEGORÍAS
    =============================================*/

    
static public function ctrMostrarCategorias($item$valor){

        
$tabla "categorias";

        
$respuesta ModeloProductos::mdlMostrarCategorias($tabla$item$valor);

        return 
$respuesta;

    }

    
/*=============================================
    MOSTRAR SUBCATEGORÍAS
    =============================================*/

    
static public function ctrMostrarSubCategorias($item$valor){

        
$tabla "subcategorias";

        
$respuesta ModeloProductos::mdlMostrarSubCategorias($tabla$item$valor);

        return 
$respuesta;

    }

?>
modelo-productos.php

Código PHP:
<?php

require_once "conexion.php";

class 
ModeloProductos{

    
/*=============================================
    MOSTRAR CATEGORÍAS
    =============================================*/

    
static public function mdlMostrarCategorias($tabla$item$valor){

        if(
$item != null){

            
$stmt Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item");

            
$stmt -> bindParam(":".$item$valorPDO::PARAM_STR);

            
$stmt -> execute();

            return 
$stmt -> fetch();

        }else{

            
$stmt Conexion::conectar()->prepare("SELECT * FROM $tabla");

            
$stmt -> execute();

            return 
$stmt -> fetchAll();

        }
        
        
$stmt -> close();

        
$stmt null;

    }

    
/*=============================================
    MOSTRAR SUB-CATEGORÍAS
    =============================================*/

    
static public function mdlMostrarSubCategorias($tabla$item$valor){

        
$stmt Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item");

        
$stmt -> bindParam(":".$item$valorPDO::PARAM_STR);

        
$stmt -> execute();

        return 
$stmt -> fetchAll();

        
$stmt -> close();

        
$stmt null;

    }
?>
¿Es posible reducir esta consulta de categorias en el cabezote.php para por ejemplo intentar tener 1 sola conexión o 2 máximo?

En general, ¿hay algún modo global de recudir todas estas conexiones o hacerlo de otra manera? Ya que como comento anteriormente al llevar esta parte a un proyecto mucho más extenso superamos las 25 y hasta 30 conexiones en algunas zonas de la web.

Saludos.
  #2 (permalink)  
Antiguo 11/06/2019, 18:38
 
Fecha de Ingreso: abril-2006
Mensajes: 257
Antigüedad: 13 años, 1 mes
Puntos: 39
Respuesta: Optimizar y reducir el número de conexiones a la base de datos

una pagina les genera 25 conexiones???, entonces el problema esta en que no se esta reusando la conexion previamente abierta, otra forma es que tambien usen CACHE de datos, o si abren una conexion luego de usarse cierrenla
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.me/pools/c/87BTML2gwr
  #3 (permalink)  
Antiguo 12/06/2019, 11:15
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.910
Antigüedad: 10 años, 10 meses
Puntos: 2162
Respuesta: Optimizar y reducir el número de conexiones a la base de datos

Muestra el código de tu clase Conexion para ver si ahí es donde está el problema.
__________________
- León, Guanajuato
- GV-Foto
  #4 (permalink)  
Antiguo 12/06/2019, 12:04
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.913
Antigüedad: 16 años, 3 meses
Puntos: 61
Respuesta: Optimizar y reducir el número de conexiones a la base de datos

Hola de nuevo.

En el archivo conexion.php tengo estos datos:


Código PHP:
<?php
 
class Conexion{
 
    public function 
conectar(){
 
        
$link = new PDO("mysql:host=localhost;dbname=nombredb",
                        
"root",
                        
"",
                        array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                              
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
                        );
 
        return 
$link;
 
    }
 
}

Gracias a ambos por vuestras respuestas.
  #5 (permalink)  
Antiguo 12/06/2019, 21:32
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.910
Antigüedad: 10 años, 10 meses
Puntos: 2162
Respuesta: Optimizar y reducir el número de conexiones a la base de datos

Intenta esto:

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

Última edición por Triby; 12/06/2019 a las 21:44



La zona horaria es GMT -6. Ahora son las 22:19.