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

 
Vista:
Imágen de perfil de José Carlos
Val: 31
Ha disminuido su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por José Carlos (15 intervenciones) el 11/06/2019 21:18:09
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!--=====================================
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
]<?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, $valor, PDO::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, $valor, PDO::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.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por xve (6935 intervenciones) el 12/06/2019 08:15:59
Hola José, no es necesario que cada vez que tengas que hacer una consulta te conectes a la base de datos... solo tienes que conectarte una vez, y utilizar esa conexión para hacer todas las consultas.

No se que hay dentro de conexion.php, pero creo que algo así te podría funcionar...
1
2
3
$db = Conexion::conectar();
$stmt=$db->prepare("SELECT ....");
$stmt=$db->prepare("SELECT ....");
...

De esta manera, solo haces una conexión a la base de datos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de José Carlos
Val: 31
Ha disminuido su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por José Carlos (15 intervenciones) el 12/06/2019 13:40:53
Hola xve

dentro de conexion.php tengo algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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;
 
	}
 
}

El ejemplo que citas, ¿iria dentro de conexión? ¿o eso tengo que aplicarlo en el modelo ante de cada consulta?

Gracias, un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por xve (6935 intervenciones) el 12/06/2019 15:36:26
La conexión solo una vez por pagina...
1
$db = Conexion::conectar();
Te devuelve el $link, por lo que no es necesario volver a conectarte en toda la pagina... una vez te has conectado, ya puedes ejecutar todas las querys que necesites sin volver a conectarte.
1
2
3
$stmt=$db->prepare("SELECT ....");
$stmt=$db->prepare("SELECT ....");
...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de José Carlos
Val: 31
Ha disminuido su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por José Carlos (15 intervenciones) el 13/06/2019 22:02:56
Hola de nuevo xve, gracias de nuevo por tu respuesta.

La verdad es que no termino de entender el mecanismo, tengo otras opciones sugeridas y aun estoy probando pero no logro el resultado que busco.

Siguiendo tu ejemplo, ¿te refieres a algo así?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*=============================================
MOSTRAR SUB-CATEGORÍAS
=============================================*/
 
static public function mdlMostrarSubCategorias($tabla, $item, $valor){
 
    //$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item");
 
    $db = Conexion::conectar();
 
    $stmt = $db->prepare("SELECT * FROM $tabla WHERE $item = :$item");
 
    $stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);
 
    $stmt -> execute();
 
    return $stmt -> fetchAll();
 
    $stmt -> close();
 
    $stmt = null;
 
}

¿La idea a la que te refieres es añadir más consultas select dentro de un mismo modelo?

En este ejemplo que supongo que no es correcto por mi parte se da el mismo número de conexiones.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por xve (6935 intervenciones) el 14/06/2019 08:43:00
No, no, no me he explicado bien...

Yo me refiero a que unicamente hay que hacer una conexión, y luego las consultas que tengas que hacer, no es necesario que te vuelvas a conectar... Una sola conexión por pagina web.

En el código que mostraste en el primer post, te conectas varias veces... y solo tienes que conectarte una vez.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de José Carlos
Val: 31
Ha disminuido su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por José Carlos (15 intervenciones) el 28/06/2019 23:53:33
Hola de nuevo xve

Finalmente parece que de esta manera logro hacer lo que me explicabas anteriormente:

Ok, supongo entonces que ahora quedaría algo así como este ejemplo:

conexion.php

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

productos-modelo.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?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, $valor, PDO::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, $valor, PDO::PARAM_STR);
 
		$stmt -> execute();
 
		return $stmt -> fetchAll();
 
		$stmt -> close();
 
		$stmt = null;
 
	}

Ahora parece que va todo perfectamente y solo se produce una conexión por página.

Gracias de nuevo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por xve (6935 intervenciones) el 29/06/2019 07:42:49
Esta perfecto!!!
Gracias por comentarlo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar