Foros del Web » Programando para Internet » PHP »

¿Baja mucho el redimiento si se usan varios mysql_connect??

Estas en el tema de ¿Baja mucho el redimiento si se usan varios mysql_connect?? en el foro de PHP en Foros del Web. Hola a todos!!! si bien esta pregunta puede ir tambien en el foro de mysql, la consulto aca porque creo que esta mas referido a ...
  #1 (permalink)  
Antiguo 19/02/2005, 10:08
 
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 9 meses
Puntos: 0
Pregunta ¿Baja mucho el redimiento si se usan varios mysql_connect??

Hola a todos!!!

si bien esta pregunta puede ir tambien en el foro de mysql, la consulto aca porque creo que esta mas referido a como se maneja php, aunque no estoy seguro... la cuestion, es que en mis scripts cuando hago consultas hago lo siguiente:

codigo...
codigo...

me conecto
selecciono la base
hago la consulta
me desconecto

codigo...
codigo...

me conecto
selecciono la base
hago la consulta
me desconecto

codigo...
codigo...

me conviene desconectarme al final del script? lo digo mas que todo por el rendimiento, no se cuanto tarda php en conectarse a mysql...

que me conviene hacer??
Gracias a todos!!!!!
__________________
Diegote ::.

www.mmsolutions.com.ar
  #2 (permalink)  
Antiguo 19/02/2005, 17:33
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 21 años, 2 meses
Puntos: 4
Bueno para que tengas una idea del rendimiento de php...

La página inicial de este foro, ejecuta más de 35 sentencias SQL al servidor de base de datos (Mysql), Claro está, en que este foro está muy bien pensado...

Ahora lo que estas haciendo lo veo un poco mal, ya que estas conectandote a cada rato en solo 1 página. Debes aprender a optimizar las Sentencias sql de modo que puedas gestionar todos los datos que quieras con la minima cantidad de sentencias SQL.

Creo que la manera que usas las conexiones, no es la más apropiada. Debes hacer lo siguiente:

<html>
<php
- Abres la conexion BD// Esto te deuelve un Manejador para las Sentencias que vallas a ejecutar.

- Haces todas las consultas a la BD

-Cierras conexion BD
php>
</html>

Si necesitas atacar 2 BD en diferentes Servidores ó con diferentes Nombres de Usuario !, es en ese monmento que debes abrir 2 ó más conexiones, tomando en cuenta que esto te va ocupar más memoria RAM.

Espero que me allas entendido.

Bye
__________________
--
NOTA: Si haz conseguido la solución a tu problema, por favor edita el titulo del tema colocando el prefijo [SOLUCIONADO], para que otros usuarios puedan encontrar soluciones más rápido.
  #3 (permalink)  
Antiguo 20/02/2005, 06:47
 
Fecha de Ingreso: octubre-2003
Ubicación: Santander
Mensajes: 236
Antigüedad: 21 años, 1 mes
Puntos: 0
¿Y qué método se usa para cerrar la conexión?.
  #4 (permalink)  
Antiguo 20/02/2005, 07:02
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 20 años, 3 meses
Puntos: 102
para cerrar una conexión se usa mysql_close();.
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #5 (permalink)  
Antiguo 20/02/2005, 17:49
 
Fecha de Ingreso: octubre-2003
Ubicación: Santander
Mensajes: 236
Antigüedad: 21 años, 1 mes
Puntos: 0
Un "cierre tipo" quedaría así?:

Código PHP:
mysql_close();
?> 
¿Y existe algún programa para diagnosticar si alguna página php tiene algún script sin cerrar o que genera un bucle infinito o cosas que carguen mucho la RAM?...

Última edición por David224; 20/02/2005 a las 17:55
  #6 (permalink)  
Antiguo 20/02/2005, 18:10
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 21 años, 6 meses
Puntos: 2
Es que muchas veces no es necesario cerrar una conexion ya que se cierra automaticamente, por otra parte, un bucle seguiria aún si la conexion se cerro, este depende de sus propias condiciones y no de que si el codigo dentro del bucle esta conectado o no, a lo sumo enviara errores de conexión en lugar de la linea que tu querias mostrar... o eso creo.
__________________
I Love Programming...
  #7 (permalink)  
Antiguo 20/02/2005, 18:23
 
Fecha de Ingreso: octubre-2003
Ubicación: Santander
Mensajes: 236
Antigüedad: 21 años, 1 mes
Puntos: 0
¿Y sabes de algún script o similar para testear este comportamiento?.
  #8 (permalink)  
Antiguo 21/02/2005, 07:38
 
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 9 meses
Puntos: 0
muchas gracias a todos!!
ya tengo un poco mas claro el panorama!!!

saludos y de nuevo... grax!!!
__________________
Diegote ::.

www.mmsolutions.com.ar
  #9 (permalink)  
Antiguo 21/02/2005, 12:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Bueno .. la idea es que conectes al principio de tu scritp (mysql_connect() o usando conexiones persistentes: msyql_pconnect()) . .hagas tus consultas SQL y de ahí te desconectas (si quieres .. pues PHP ya cierra las conexiones el solo al terminar el script).

Lo que si que puedes hacer es ir liberando memoria cuando termines de usar tu BD en un proceso lógico de ejecución de un script con:

mysql_free_result()

Sobre el tema del rendimiento .. cada "mysql_connect()" implica un "negociado" del usuario/contraseña para autentificarse contra tu BD (Mysql) .. En un mismo script (flujo) puedes como ya te han comentado .. hacer uno sólo y usarlo cuantas veces requieras en el mismo script y liberar memoria si hay muchos otros procesos por médio "PHP" que no usan tu BD hasta el próximo acceso a tu BD.

También puedes usar conexiones persistentes (mysql_pconnect()) que .. en un principio consumen más recursos del servidor vs el tiempo de conexión se reduce .. pues si un script PHP está conectado "persistente" no se reconecta (negociando el "login") hasta que se pierda la conexión con el "cliente" que lo inició (es decir, si cambias de script .. la conexión queda abierta por un tiempo hasta la próxima petición . .he de ahí que se consuma más recursos; las conexiones no son ilimitadas .. así que hay que tener preacución cuando se usan ..)


Un saludo,
  #10 (permalink)  
Antiguo 21/02/2005, 16:21
 
Fecha de Ingreso: octubre-2003
Ubicación: Santander
Mensajes: 236
Antigüedad: 21 años, 1 mes
Puntos: 0
Interesantísimo Cluster :)

Esta línea me parece muy buena

mysql_free_result()

Hay que meterla en vez del mysql_close() . O por el contrario es complementaria?.

Como ejemplo práctico: ¿chupa muchos recursos de servidor una web cuyas páginas hacen como máximo 2 conexiones a bases de datos y suelen ser casi siempre para paginar (con el maravilloso paginator ;))?.

Lo que me mata un poco es la portada, que tendría que tener entre 5 y 10 conexiones a base de datos .....

Pero como digo, todas son muy sencillas y se limitan a paginar contenido para que luego el visitante acuda al artículo que le interese.
  #11 (permalink)  
Antiguo 21/02/2005, 18:08
 
Fecha de Ingreso: diciembre-2003
Mensajes: 1.583
Antigüedad: 20 años, 10 meses
Puntos: 13
Si te vas a conectar a una sola base de datos, basta con que te conectes una sola vez, no es necesario que lo hagas cada vez que necesites acceder a las tablas en una sola página.

mysql_close() y mysql_free_result() cumplen funciones distinas. Mientras la primera se utiliza para cerrar una conexión (en casos que sea estrictamente necesario, pues como ya te explicaron) este cierre se ejecuta automaticamente cuando finalizas el script php de tu página), la segunda se utiliza para liberar memoria al finalizar cada proceso con base de datos que realices (no se si se utiliza solo con los SELECT o sirve para otras acciones).

Te pongo un ejemplo de mysql_free_result():

Al principio de tu página seleccionas "noticias" que tienes almacenadas en la base de datos y las imprimes en pantalla. Los registros seleccionados siguen disponibles para reutilizarlos, y eso implica consumo de memoria. Si esos resultados no necesitas usarlos nuevamente (dentro de la misma pagina) puedes eliminarlos de la memoria con mysql_free_result() para liberar recursos. Pero eso significa que despues de ejecutar esa funcion ya no tendrás acceso a dichos resultados porque ya no existen.

¿capici?
__________________
El conocimiento es libre: Movimiento por la Devolución
  #12 (permalink)  
Antiguo 21/02/2005, 20:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
mysql_free_result() lo puedes usar despues de tu mysql_fetch_xxx() o mysql_result() que uses .. eso liberarà memoria .. y si a su vez quieres cerrar la conexión a continuaciòn usas mysql_close().

Para usar mysql_free_result() en realidad se usa cuando se ejecutan esas funciones las cuales las has tenido que usar por què has hecho algún SELECT .. o algún SHOW ... o alguna función SQL que devuelva algún resultado (un INSERT o un UPDATE, DELTE y alguno más que ahora no recuerdo no devuelven resultado en sí, no son funciones de "consulta")

Un saludo,
  #13 (permalink)  
Antiguo 22/02/2005, 06:34
 
Fecha de Ingreso: octubre-2003
Ubicación: Santander
Mensajes: 236
Antigüedad: 21 años, 1 mes
Puntos: 0
Muchas gracias por esta información a todos :) porque la verdad es algo que me preocupaba bastante.

He probado a meter esto
Código PHP:
mysql_free_result();
mysql_close();
?> 
Pero me da error en la línea del free result. El error es este: Warning: Wrong parameter count for mysql_free_result()

Última edición por David224; 22/02/2005 a las 06:40
  #14 (permalink)  
Antiguo 22/02/2005, 13:33
 
Fecha de Ingreso: octubre-2003
Ubicación: Santander
Mensajes: 236
Antigüedad: 21 años, 1 mes
Puntos: 0
Tal vez entre los parentesis de las líneas de código tenga que meter el nombre de la conexión que previamente he abierto?
  #15 (permalink)  
Antiguo 22/02/2005, 13:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Debes revisar la documentación oficial de esa función y su uso en www.php.net

Si te fijas .. el "free_result" necesita del link de conexión abierto y que deberías asignar para que esa "liberación" de memoria pueda ser selectiva.

Un saludo,
  #16 (permalink)  
Antiguo 22/02/2005, 14:03
 
Fecha de Ingreso: enero-2004
Ubicación: Santiago
Mensajes: 127
Antigüedad: 20 años, 10 meses
Puntos: 0
Cita:
Iniciado por David224
Tal vez entre los parentesis de las líneas de código tenga que meter el nombre de la conexión que previamente he abierto?
Sólo en el mysql_free_result() debes especificarle concretamente de "donde" liberar la memoria, de que consultao proceso.

Código PHP:
$resultado_consulta1 mysql_query(" BLAH BLAH"$conexion);
while (
$row mysql_fetch_assoc($resultado_consulta1)) {
    
blah... blah... blah con los datos.
}
mysql_free_result($resultado_consulta1); // Aqui deberás poner tu funcion liberadora de memoria :-D 
Saludos
  #17 (permalink)  
Antiguo 22/02/2005, 16:26
 
Fecha de Ingreso: octubre-2003
Ubicación: Santander
Mensajes: 236
Antigüedad: 21 años, 1 mes
Puntos: 0
cuando un usuario abandona la página esa sesion sigue abierta en el servidor consumiendo memoria de algun tipo?
  #18 (permalink)  
Antiguo 22/02/2005, 17:08
Avatar de Ruchu  
Fecha de Ingreso: octubre-2001
Mensajes: 698
Antigüedad: 23 años, 1 mes
Puntos: 2
Cuando el script acaba su ejecucion se cierra automaticamente tanto las conexiones abiertas como los recordsets abiertos.
De hecho el mysql_free_result, solo se suele usar si se hacen consultas a bd que devuelven muxos registros, xq entonces si que ocupan bastante ram. Pero que vaya, que a mi parecer ni aun en este caso es necesario generalmente hacer los free.

Eso si, si hablamos de php. Porque por ejemplo con ASP no ocurre esto. Si tu no cierras un recordset o una conexion a bd, ésta se queda abierta y se come recursos inutilemnte del servidor... hasta que muere.


Y ya que se esta hablado de conexiones y desconexiones a bd, de conecxiones persistentes o no...

Cuando desde una pagina web, ya sea asp,php... se establece conexion con una bd sql server, se hacen las consultas necesarias.... y se cierra la conexion o se acaba el script, el motor del sqlserver no cierra la conexion (si se activa la opcion).
Ésta la deja abierta durante 10 segundos (creo que este tiempo era configurable) como máximo a la espera de que el mismo usuario solicite otra conexion a bd, entonces no se crea una de nuevo, sino que se le asigná la que aun está en RAM de la máquina.

No hace falta crear conexiones persistentes en estos casos.

Mysql tiene algo parecido?

Última edición por Ruchu; 22/02/2005 a las 17:14
  #19 (permalink)  
Antiguo 23/02/2005, 05:39
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Mysql y la mayoría de otros motores de BD con respecto al uso de sus funciones bajo PHP para su conexión y demás tienen las conexiones persistentes:

mysqlp_connect()

Si lo usas .. le dices a "Mysql" que mantenga la conexión durante un tiempo .. No sé el tiempo concreto .. pero mientras no se está ejecutando nada .. una conexión persistente queda en estado "sleep" (si mal no recuerdo) .. Sólo guardando información de la conexión (host que la pidió y autentificación) .. Otra cosa sería hablar de "caché" que pueda gestionar Mysql internamente para las consultas realizadas (en tal caso .. usa el foro de "Base de datos" para que te aclaren esos puntos.)

Un saludo,
  #20 (permalink)  
Antiguo 23/02/2005, 06:29
 
Fecha de Ingreso: julio-2002
Ubicación: Capital Federal
Mensajes: 66
Antigüedad: 22 años, 4 meses
Puntos: 0
Un cosejito que creo que no está de más: creá un variable que contenga toda info de la conexión a la base de datos para que cuando cierres la conexión lo hagas de la manera más segura posible. ejemplo:

Código PHP:
$link mysql_connect('localhost''mybase_db''xxxPASSWORDxxx');
// hacés todas las locuras que quieras
// y cerrás solo la conexion que abriste.
mysql_close($link); 
Esto te va a servir para cerrar TODAS las conexiones de manera segura. Si usás más de una conexion, con que hagas una variable $link_1, $link_2, $link_usuarios, etc. te asegurás, con un mysql_close($link_xxxx) para cada variable, que cerraste cada una de las conexiones.
Otra cosa (si seguís paranoico), podés validar si abre o cierra una conexion porque las dos funciones (mysql_connect() y mysql_close()) devuelven true si tuvieron exito en su tarea. podés validarlo así.

Código PHP:
function conectar(){
$link mysql_connect('localhost''mybase_db''xxxPASSWORDxxx');
if (
$link){ //pregunta si $link es true
    
return $link;
} else {
    echo 
"UPS! reventé el servidor... jijiji..."
}

// esta funcion la usas para abrir (si conectó, devuelve el id para después 
//cerrar. ahora la llamo y pongo el $link en una variable

$conexion conectar(); 

// para cerrar validás de esta manera:

$no_se_si_cierra mysql_close($conexion);
if (
$no_se_si_cierra){
     echo 
"cerré la conexion";
} else {
     echo 
"¿Qué ese humito que sale por el CPU?";

los "echo" son para avisarte, pero podrías intentar cerrar la conexion otra vez o lo que quieras.
Esto te va a servir mucho cuando abras muchas conexiones y puede ser que algunas te fallen como no

Saludos!

A.
__________________
Adrián (@ RHCP I Wanna Be Funky Flea)
  #21 (permalink)  
Antiguo 23/02/2005, 07:32
 
Fecha de Ingreso: septiembre-2004
Ubicación: Montevideo
Mensajes: 346
Antigüedad: 20 años, 2 meses
Puntos: 0
Que establece el limite de las conexiones que se pueden hacer a una base de datos:

Cita:
las conexiones no son ilimitadas .. así que hay que tener preacución cuando se usan ..)
Saludos,

Liber
__________________
Liber
  #22 (permalink)  
Antiguo 23/02/2005, 08:16
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Lo define la configuración de tu BD .. por ejemplo Mysql lo hace en su my.ini o my.conf en la directiva: max_connections (100 por defecto).. y ese n° viene determinado por las características técnicas del própio motor y recursos del servidor (principalmente memoria) ..

Más detalles para Mysql:
http://dev.mysql.com/doc/mysql/en/to...nnections.html

Un saludo,
  #23 (permalink)  
Antiguo 23/02/2005, 08:23
 
Fecha de Ingreso: septiembre-2004
Ubicación: Montevideo
Mensajes: 346
Antigüedad: 20 años, 2 meses
Puntos: 0
Cita:
Iniciado por Cluster
...las conexiones no son ilimitadas .. así que hay que tener preacución cuando se usan ..)Un saludo,
Hola a todos,

que es lo que determina la limitacion a la que haces referencia Cluster?

Saludos.

Liber
__________________
Liber
  #24 (permalink)  
Antiguo 23/02/2005, 08:24
 
Fecha de Ingreso: septiembre-2004
Ubicación: Montevideo
Mensajes: 346
Antigüedad: 20 años, 2 meses
Puntos: 0
gracias Cluster
__________________
Liber
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:26.