Sobre conexiones a base de datos en PHP
Me surge esta duda sobre las conexiones a base de datos en PHP. Supongamos que tengo varias clases con sus constructores, sus métodos de consulta que devuelven datos ...etc.
La duda que tengo es que si en cada uno de los métodos abrís y cerrais una conexión o no. En caso de no hacerlo como lo haceis ¿Abris una conexion al principio de la pagina PHP y pasais la conexión como argumento a esos métodos?
Lo digo por que por ejemplo imaginad que teneis un método que lista una serie de registros por ejemplo id_de_empleado y que con cada id_de_empleado contruye un objeto empleado y lo mete en un ArrayList para devolverlo al final. Si en la base de datos tuviesemos 1000 empleados, y cada vez que construyesemos un objeto abriésemos una conexión, sería un problema ¿no?
¿Como solucionais esto? o no importa abrir tantas conexiones
portishead
Claro, en cuestiones pequeñas igual no hace falta meterse en jaleos. El ejemplo que planteba era solo una parte de un sistema más grande, por eso me preguntaba si era una práctica recomendable la que hacía o había mejores formas de hacerlo, o formas más eficientes. Pero sí, estoy contigo, a veces cuanto más simple, mejor.
markshock
Quizás no sea la persona mas adecuada para contestar a este tema, por que yo personalmente no suelo usar siempre objetos para todo... siempre tengo en cuenta la magnitud del proyecto y en función de ello desarrollo unos objetos (que a la larga me van a optimizar el trabajo) o no.... (y quizás con este comentario que he hecho alguien me salta al cuello... pero bueno)
En el hipotético caso de que tuviera que hacer un listado de personas con sus datos personales, tomando esto como un simple listado, yo lo que haría sería ejecutar una consulta SQL al inicio del fichero, introducir mediante un while($row = mysql_fetch_array($resultado_query)) en un array del tipo $array[$x]["nombre"], $array[$x]["dni"]..... y cierro la conexión, entonces ya donde ha de aparecer el listado, hago un for... y printo los datos correspondientes montando el listado en cuestión....
Así de simple y rápido..... sin liarme tanto como tu lo has hecho....
Si algo creo, es que a veces, cuanto mas simple, mejor... (siempre cuando convenga hacerlo simple y no nos vaya a causar una molestia dentro del mismo proyecto claro...)
portishead
Sí, claro, eso lo hacia antes y lo he modificado, con lo que ahora la aplicación responde mejor. Y ya puestos, me preocupa la manera que tengo de hacer las cosas, que es como las hacía cuando programaba con Java. Supongamos que tengo que listar un monton de personas. Lo que hago es crear una clase Persona con sus atributos (supongamos 20 , nombre, dead, dni,....), sus getters y setters, y su constuctor que al pasarle el ID me saca todos los datos de la persona. ¿OK?.
Para listar las personas creo un método a la clase Persona que sea listarPersonas(). Ese metodo es una quey que me lista los ID de las personas. Por cada id construyo un objeto Persona y lo meto en un ArrayList (Un ArrayList de 20 personas). Eso es lo que devuelve el método: un ArrayList de personas.
Así, en la pagina encargada de listar, llamo a ese método, me devuelve el arrayList y "pinto" los objetos Persona a traves de sus getters y sus setters.
¿Esto es eficiente?
Perdonad por la "chapa" ;-)
markshock
No es lo mismo que abras/cierres 20 conexiones en 20 "posibles visitas" de página...
que por ejemplo entres en una página que tiene un listado, con 400 registros y que tengas una función que recoge los datos de los registros para imprimirlos en pantalla y que dicha función cada vez que hace una consulta abra/cierre una conexión.... eso quiere decir que en ese listado de 400 registros abririas/cerrarias 400 veces una conexión a la base de datos, sin contar las otras funciones que estes usando al mismo tiempo para otras gestiones y que hagan lo mismo...
en cambio si abres 1 y la pasas como parametro... todo eso que le ahorras al servidor, que no está la cosa para trabajar por que si, ni siendo un server :P
portishead
Sí, de moemento hago lo que dice markshock, pero claro, si una misma aplicación consta de digamos 20 paginas, por cada sesion, si el usuario visita todas, serían 20 conexiones (una conexion abierta y cerrada por cada página) ¿no? ¿Sería eso un problema?
markshock
Para no sobre cargar el servidor creando y eliminando conexiones tontamente, como dice dagi3d, lo mejor es abrir una conexión al principio de la página y cerrarla al final, pasando la conexión como parámetro a todas las funciones / clases que la requieran.
Si te estas iniciando en esto del PHP, lo mejor es que durante una temporada lo hagas todo "a pelo", sin frameworks ni ostias, una vez te hayas machacado los dedos picando SQL's y funciones, valoraras mucho mas la ayuda de un ORM / framework, y lo entenderás muchísimo mejor.
dagi3d
A grosso modo lo que se suele hacer es abrir la conexión al comienzo del ciclo de vida de la petición en el servidor y trabajar con esa única conexión para cerrarla una vez haya finalizado la petición
Hay otros lenguajes como Java que permiten trabajar con un pool de conexiones y así no estar creándolas en cada petición
Por lo que deduzco de tu comentario harías una consulta por cada fila devuelta para obtener el registro asociado a otra fila. Esto es algo realmente ineficiente ya que en caso de tener 1000 resultados en la primera query, estarías haciendo 1000 consultas adicionales cuando lo puedes tener resuelto desde la primera usando los JOIN
Y por último, a menos que vaya a hacer algo realmente simple, suelo optar por usar algún ORM que me facilite la vida y se encargue de entre otras cosas, de la gestión de la conexión a la base de datos y el mapeo de las tablas y los objetos, aunque también es cierto que al principio es recomendable a hacerlo a manopla para pelearse con el SQL
En php he trabajado con Doctrine y funciona muy bien
portishead
Bueno, ahora que me doy cuenta, lo he metido en Programación Cliente y debería ir en Programación Servidor. Lo siento. Si lo pueden mover los administradores, mejor. Gracias