La gestión de conexiones a bases de datos es un aspecto fundamental en el desarrollo de aplicaciones web robustas y eficientes. En PHP, la extensión PDO (Objetos de Datos de PHP) proporciona una interfaz ligera y consistente para acceder a bases de datos. Comprender cómo se establecen, mantienen y, crucialmente, cómo se cierran estas conexiones es esencial para evitar problemas como el agotamiento de recursos del servidor de base de datos.

Las conexiones a bases de datos se establecen creando instancias de la clase base PDO. No importa qué controlador de base de datos desees usar (MySQL, PostgreSQL, SQLite, etc.), siempre utilizas el nombre de la clase PDO. El constructor acepta parámetros para especificar la fuente de la base de datos (conocida como DSN), y opcionalmente, el nombre de usuario y la contraseña.

Aquí tienes un ejemplo básico de cómo establecer una conexión a una base de datos MySQL:
<?php $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); ?>Si ocurren errores durante el intento de conexión, se lanzará un objeto PDOException. Puedes capturar esta excepción utilizando un bloque try...catch si deseas manejar la condición de error de manera específica, como intentar reintentar la conexión después de un tiempo de espera, o puedes dejar que un manejador global de excepciones configurado con set_exception_handler() se encargue de ello.
Manejar los errores de conexión es una buena práctica:
<?php try { $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); // La conexión fue exitosa } catch (PDOException $e) { // Manejar el error de conexión // Por ejemplo, registrar el error o mostrar un mensaje amigable al usuario // error_log('Error de conexión a la base de datos: ' . $e->getMessage()); // die('No se pudo conectar a la base de datos.'); } ?>Es importante recordar que, al igual que cualquier otra excepción, PDOException debe ser manejada. Si una excepción de conexión no es capturada, resultará en un error fatal (E_FATAL_ERROR) que podría exponer detalles sensibles de la conexión en el mensaje de error, especialmente si display_errors está activado en un servidor de producción. Por lo tanto, es fundamental configurar display_errors a 0 en entornos de producción.
La Vida Útil de una Conexión PDO
Una vez que la conexión a la base de datos se establece con éxito, se devuelve una instancia de la clase PDO a tu script. La conexión permanece activa durante toda la vida útil de ese objeto PDO. Esto significa que mientras la variable que contiene el objeto PDO exista y sea accesible, la conexión a la base de datos estará abierta y lista para ser utilizada.
Cerrando la Conexión Explícitamente
Para cerrar una conexión de base de datos utilizando PDO, necesitas destruir el objeto PDO. Esto se logra asegurándote de que todas las referencias restantes a ese objeto sean eliminadas. La forma más sencilla y común de hacer esto es asignando el valor null a la variable que contiene la instancia de PDO.
Considera el siguiente ejemplo donde se establece una conexión, se utiliza para realizar una consulta, y luego se cierra explícitamente:
<?php // Establecer la conexión $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); // Usar la conexión para realizar una consulta $sth = $dbh->query('SELECT * FROM tabla_ejemplo'); // Procesar los resultados si es necesario... // Hemos terminado de usar la conexión; ahora la cerramos // Primero, eliminar referencias a cualquier objeto PDOStatement derivado $sth = null; // Luego, eliminar la referencia al objeto PDO $dbh = null; // En este punto, la conexión a la base de datos ha sido cerrada ?>Es crucial notar que si existen otras referencias a esta instancia de PDO (por ejemplo, desde una instancia de PDOStatement, o desde otras variables que hagan referencia al mismo objeto PDO), estas referencias también deben ser eliminadas (por ejemplo, asignando null a la variable que referencia el PDOStatement) antes de que el objeto PDO pueda ser completamente destruido y la conexión cerrada.
¿Por Qué Cerrar una Conexión?
Aunque PHP cerrará automáticamente la conexión a la base de datos cuando el script termine su ejecución, hay situaciones en las que cerrar la conexión explícitamente puede ser beneficioso. Una razón importante, mencionada en la información proporcionada, es liberar recursos en el servidor de base de datos.

Si tu script realiza una consulta, recupera todos los resultados y luego tiene una cantidad significativa de procesamiento que hacer que no requiere la conexión a la base de datos, mantener la conexión abierta durante todo ese procesamiento posterior es un uso innecesario de los recursos del servidor de base de datos. Cada conexión activa consume memoria y otros recursos en el servidor de la base de datos. Si tu servidor web está bajo una carga pesada y muchos scripts mantienen conexiones abiertas innecesariamente, el servidor de base de datos podría alcanzar su límite máximo de conexiones, impidiendo que nuevas solicitudes se conecten y causando errores para los usuarios.
Cerrar la conexión explícitamente tan pronto como ya no la necesites libera ese recurso en el servidor de base de datos, permitiendo que otros procesos o scripts utilicen esa ranura de conexión. Esto es particularmente relevante en aplicaciones con altos volúmenes de tráfico.
¿Qué Sucede Si No Cierras la Conexión Explícitamente?
Como se mencionó anteriormente, si no cierras explícitamente la conexión PDO asignando null a la variable que la contiene (y a cualquier otra referencia), PHP cerrará automáticamente la conexión cuando el script finalice. En muchos escenarios, especialmente en scripts simples o aquellos que terminan poco después de interactuar con la base de datos, confiar en el cierre automático es perfectamente aceptable y común.
Sin embargo, la práctica de cerrar explícitamente puede ser útil para optimizar el uso de recursos en scripts largos o complejos donde la interacción con la base de datos ocurre al principio o en medio de la ejecución, pero no es necesaria hasta el final.
Conexiones Persistentes: Un Escenario Diferente
Es importante distinguir las conexiones estándar de las conexiones persistentes. Muchas aplicaciones web pueden beneficiarse del uso de conexiones persistentes a servidores de bases de datos. Las conexiones persistentes no se cierran al final del script, sino que se almacenan en caché y se reutilizan cuando otro script solicita una conexión utilizando las mismas credenciales.
El caché de conexiones persistentes permite evitar la sobrecarga de establecer una nueva conexión cada vez que un script necesita comunicarse con la base de datos, lo que generalmente resulta en una aplicación web más rápida debido a la reducción de la latencia de conexión. Para usar conexiones persistentes con PDO, debes establecer la opción PDO::ATTR_PERSISTENT a true en el array de opciones del controlador pasado al constructor de PDO:
<?php $dbh = new PDO( 'mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true) ); ?>Es fundamental que la opción PDO::ATTR_PERSISTENT se establezca en el array de opciones pasado al constructor. Si intentas establecer este atributo después de la instanciación del objeto utilizando setAttribute(), el controlador no utilizará conexiones persistentes. Las conexiones persistentes, por su naturaleza, no se cierran explícitamente al final del script; su gestión recae en el propio PHP y la configuración del servidor web.

Preguntas Frecuentes (FAQ)
¿Cuál es la forma correcta de cerrar una conexión PDO en PHP?
La forma estándar y recomendada para cerrar explícitamente una conexión PDO es asignar el valor null a la variable que contiene la instancia del objeto PDO (por ejemplo, $dbh = null;). También debes asegurarte de que cualquier otra variable que haga referencia a la misma conexión o a objetos derivados de ella (como instancias de PDOStatement) también se establezca a null.
¿Es siempre necesario cerrar la conexión explícitamente?
No siempre es estrictamente necesario. PHP cerrará automáticamente la conexión de base de datos cuando el script PHP termine de ejecutarse. Sin embargo, cerrar la conexión explícitamente puede ser una buena práctica en scripts largos o complejos para liberar recursos en el servidor de base de datos tan pronto como ya no sean necesarios, lo que puede ayudar a prevenir que el servidor de base de datos alcance su límite máximo de conexiones bajo alta carga.
¿Qué pasa si no cierro explícitamente la conexión?
Si no cierras la conexión explícitamente, PHP la cerrará automáticamente al finalizar la ejecución del script. En muchos casos, esto es suficiente y no causa problemas. El cierre explícito es principalmente una técnica de optimización de recursos para escenarios específicos.
¿Cómo cierro una conexión persistente?
Las conexiones persistentes no se cierran explícitamente en el código PHP de la misma manera que las conexiones no persistentes. Son gestionadas por PHP y el servidor web, y permanecen abiertas a través de múltiples solicitudes para ser reutilizadas. No debes intentar cerrar explícitamente una conexión que fue establecida como persistente asignándole null, ya que esto no cerrará la conexión subyacente en el caché persistente.
En resumen, mientras que PHP se encarga del cierre automático de las conexiones PDO al finalizar el script, la asignación explícita a null ofrece un control más preciso sobre la liberación de recursos, lo cual puede ser valioso en aplicaciones con requisitos de rendimiento y escalabilidad exigentes. La elección entre cierre explícito y confiar en el cierre automático dependerá de las necesidades específicas de tu aplicación.
Si quieres conocer otros artículos parecidos a Cómo Cerrar Conexiones PDO en PHP puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL