Como cerrar la conexión PDO de PHP

Cierre de conexión a base de datos usando la clase PDO y PDOStatement. Ejemplos y soluciones al problema.

objetos php conexión php PDO

La conexión a base de datos mediante PDO suele ser mi favorita, y es que me encanta poder conectarme a distintos SGBD con una misma metodología. Pero hay un problemilla que está pendiende de solucionar por parte de los desarrolladores de PHP: cerrar la conexión a la base de datos.

¿Por qué es complicado cerrar la conexión PDO?

Siempre que realizamos una conexión a base de datos, debemos cerrar la conexión abierta. Este punto es común para todas las conexiones en PHP (al menos las no persistentes), y cada una de las formas de conectarse a base de datos en php suele tener su propia función de desconexión. Normalmente con un close() o disconnect().

Pero cuando uno comienza a utilizar PDO y se pone manos a la obra, la documentación general obvia la desconexión. Así que vivimos felices hasta que un buen día nuestra aplicación web está saturada de conexiones sin cerrar. ¿La solución? Dificil, o mejor dicho poco ortodoxa, ya que no existe un close() o disconnect() de PDO para cerrar la conexión. 

¿Cómo cerrar la conexión PDO?

Para cerrar la conexión PDO lo que haremos es liberar recursos del sistema relacionados. ¿Cómo? Pues poniendo a valor nulo (null) las variables que intervienen en el proceso de la consulta: el objeto PDOStatement que trata y manipula nuestras consultas y el objeto PDO.

Así para una conexión con la clase PDO a una base de datos en servidor local, de nombre Test y con usuario y contraseña root como la siguiente:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=Test, 'root', 'root');

Y en la que realizamos una consulta preparandola con PDO y ejecutándola con el método execute() de PDOStatement:

$stmt = $pdo->prepare('SELECT * FROM user');
$result = $stmt->execute();

Cerrariamos la conexión con las siguientes líneas de código:

$stmt->closeCursor(); // opcional en MySQL, dependiendo del controlador de base de datos puede ser obligatorio
$stmt = null; // obligado para cerrar la conexión
$pdo = null;
?>

Las líneas imprenscindibles para cerrar la conexión PDO son:

  • la línea que libera el objeto PDOStatement: $stmt = null
  • liberar el objeto de conexión PDO: $pdo = null

Función para cerrar conexión base de datos

Como hemos visto, cerrar la conexión, aunque no sea a través de la forma ortodoxa con un método propio, no es demasiado complejo. Pero esta tarea se puede volver monótona o inducir al error si en cada uno de nuestros scripts debemos recurrir a las líneas de código anteriores.

Así, lo ideal sería utilizar una función propia que nos cierre la conexión para PDO y que nos evite posibles errores. Una versión útil si siempre denominamos de igual forma a las conexiones y a los resultados de prepare() sería:

<?php
function disconnect () {
   global $pdo, $stmt;
   $stmt->closeCursor();
   $stmt = null;
   $pdo = null;
}
?>

Esta función podría ser una de varias que encapsulen los diferentes usos de tus conexiones PDO. En el caso de que sea una utilidad te recomiendo (si no lo haces ya) que la incluyas como método estático en una clase de utilidades. Leer en el código PDOUtils::disconnect() es mucho más visual y limpio que una llamada a una función disconnect().

Otra opción diferente es realizar la función con parámetros de entrada:

<?php
function disconnect ( $pdo, $stmt ) {
   global $pdo, $stmt;
   $stmt->closeCursor();
   $stmt = null;
   $pdo = null;
}
?>

Extra: Crear un método para cerrar la conexión PDO encapsulada

En una anterior publicación presenté una clase para encapsular el funcionamiento de PDO. En este clase de encapsulamiento creada por Sr codigo fuente puedes ver un método disconnect funcionando a la perfección.

Publicaciones relacionadas:

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Cargando comentarios

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.