<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE></TITLE>
<META http-equiv=Content-Type content=text/html;charset=ISO-8859-1>
<META content="MSHTML 6.00.2900.2802" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffffff>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2>Amigos de la lista:</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2>Al iniciar mi comentario pensaba tener razones mas que
justificadas para mi forma de trabajo, pero ahora que lo pienso con mas
detenimiento no estoy tan seguro.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2>Bien les expongo de que se trata.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2>Uno de los mayores peligros que enfrentamos cuando
programamos en una Web es el tema de la conexión a una Vd., sobre todo cuando la
información que estamos desplegando es lo suficiente grande para que se produzca
un pequeño retardo en la consulta y el retorno de la
información.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2>No falta quien por desgracia presionan la tecla F5
reiteradas veces o la dejan presionada, en otras palabras se interrumpa la carga
de la pagina con el propósito de generar una sobre carga de conexiones
simultaneas.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2>Lo cual podrá permitir que se generen N -1 cantidad de
conexiones simultaneas desde el mismo punto y si sumamos al menos dos tipos así
haciendo esto al mismo tiempo, nuestro amado servidor no quedaría
desprotegido...</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=750045918-10022006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV><FONT face=Arial color=#0000ff
size=2></FONT><BR>
<DIV class=OutlookMessageHeader lang=es dir=ltr align=left>
<HR tabIndex=-1>
<FONT face=Tahoma size=2><B>De:</B> php-bounces@listas.inf.utfsm.cl
[mailto:php-bounces@listas.inf.utfsm.cl] <B>En nombre de </B>Rodrigo
Fuentealba<BR><B>Enviado el:</B> 10-02-2006 15:09<BR><B>Para:</B> Lista de
desarrolladores en PHP<BR><B>Asunto:</B> Re: Pool de conexiones en
PHP<BR></FONT><BR></DIV>
<DIV></DIV>JuanPa wrote:
<BLOCKQUOTE cite=mida9b983730602100539y487e39bau@mail.gmail.com type="cite">
<DIV>
<DIV>Hola listeros....<BR>Te agradezco nuevamente Rodrigo por dar tu valioso
tiempo aclarando mis dudas, <BR><BR>A raiz de es comentario es que he optado
por utilizar mis clasicas conexiones no persistentes
<BR></DIV></DIV></BLOCKQUOTE>ejalé ;)<BR>
<BLOCKQUOTE cite=mida9b983730602100539y487e39bau@mail.gmail.com type="cite">
<DIV><BR>
<BLOCKQUOTE class=gmail_quote
style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT: rgb(204,204,204) 1px solid">Es
mejor usar conexiones no persistentes, es decir, abriendo la conexión<BR>al
principio de tu script y cerrando la conexión al final, pues siempre <BR>vas
a tener páginas que no hagan ninguna consulta a la base de datos...<BR>¿Para
qué, entonces, tendrás una conexión abierta? Es únicamente un<BR>desperdicio
de recursos.</BLOCKQUOTE>
<DIV><BR>Ademas no voy a esperar que el GC (Garbage Colector) haga su trabajo,
una ultima cosa... <BR></DIV></DIV></BLOCKQUOTE>Bueno el recolector de basura
funcionará igual, pero cerrando menos cosas.<BR>
<BLOCKQUOTE cite=mida9b983730602100539y487e39bau@mail.gmail.com type="cite">
<DIV>
<BLOCKQUOTE class=gmail_quote
style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT: rgb(204,204,204) 1px solid">Por
eso es mejor abrir la conexión al principio de un script y cerrarla<BR>al
final, y si tienes funciones que recuperan datos como el caso de tu
<BR>buscar alumno, en vez de abrir una conexión nueva, preguntes si ya
hay<BR>una conexión abierta para aprovecharla.</BLOCKQUOTE>
<DIV><BR>Pero ¿ esto no significa que la conexion deberìa ser persistente? o
te refieres a que deberia pasar por parametros a mi objeto conexion que tiene
un recurso de conexion interno($link) y luego verificar si esta está abierta.
<BR></DIV></DIV></BLOCKQUOTE>Una conexión no persistente se abre al inicio de un
archivo (supongamos insertar.php) y se debe cerrar al final de éste. Si tienes
un archivo que se llama modificar.php, ese debe declarar otra conexión, pues la
primera no estará.<BR><BR>La conexión persistente se abre al inicio de la sesión
(mientras el usuario está conectado) y puede pasarse por varias páginas. Si
tienes un archivo insertar, modificar, eliminar, buscar, etc, cuantoquieras.php,
todos esos archivos usarán conexiones persistentes.<BR><BR><!-- leo de otro
mail<BR>una conexion persistente permite re-utilizar una conexion ya abierta,
ademas de tener que cerrarla explicitamente sino queda "abierta"! la idea es
evitar el tiempo (milisegundos?) que se ocupa en "establecer" una conexion. su
uso a mi entender esta reservado a sitios con muchas conexiones nuevas, con
procesos cortos. <BR>-- leido --><BR><BR>Esto es cierto, yo dije "una vez por
usuario/sesión", queriendo enfocar a que la conexión estaba abierta y podía ser
aprovechada por varias páginas que visita un usuario desde un navegador. (pues
una conexión se abre solamente para un usuario).<BR><BR>
<BLOCKQUOTE cite=mida9b983730602100539y487e39bau@mail.gmail.com type="cite">
<DIV>Y finalmente cuando dices... <BR></DIV>
<BLOCKQUOTE class=gmail_quote
style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT: rgb(204,204,204) 1px solid">Cualquiera
de las dos conexiones funciona así, la diferencia es que la <BR>persistente
la abres una vez por usuario (o por conexion?) ..<BR></BLOCKQUOTE>Esto
significa ¿ Que la conexion seguira abierta en cada script que valla
ejecutando el usuario, mientras no se cierre explicitamente en otro script o
cuando el usuario cierre el navegador ? <BR></BLOCKQUOTE>Ahhh, eso con ejemplo
(ahora haré código real con adodb)... "notese, solamente una conexión no
persistente"<BR><BR><?php<BR> echo("Abriendo la primera
conexión")<BR> $conexion =
ADONewConnection("postgres");<BR>
$conexion->NConnect($host,$user,$pass,$base);<BR> $sql =
$conexion->Prepare("SELECT * FROM alumno WHERE rut_alumno =
?");<BR> $rs =
$conexion->Execute($sql,array('12345678-9'));<BR>
$conexion->Close();<BR><BR> echo("Abriendo la segunda
conexión");<BR> $conexion =
ADONewConnection("postgres");<BR>
$conexion->NConnect($host,$user,$pass,$base);<BR> $sql =
$conexion->Prepare("SELECT * FROM apoderado WHERE rut_alumno =
?");<BR> $rs =
$conexion->Execute($sql,array('12345678-9'));<BR>
$conexion->Close();<BR><BR> $conexion =
ADONewConnection("postgres");<BR>
$conexion->NConnect($host,$user,$pass,$base);<BR> $sql =
$conexion->Prepare("SELECT * FROM cuotas WHERE rut_alumno =
?");<BR> $rs =
$conexion->Execute($sql,array('12345678-9'));<BR>
$conexion->Close();<BR>?><BR><BR>El ejemplo anterior es un script
demasiado mega mal hecho. Abres tres veces una conexión nueva y no destruyes las
conexiones anteriores. Digamos que solamente las desconectas. Uhhh, en este
pequeño script te gastaste tres conexiones. ¿Qué mal, no?. Pues ahora veamos
cómo lo habría hecho con una sola conexión no
persistente.<BR><BR><?php<BR> echo("Abriendo la
conexión")<BR> $conexion =
ADONewConnection("postgres");<BR>
$conexion->NConnect($host,$user,$pass,$base);<BR><BR>
dibujemos();<BR><BR> // con la misma conexion no persistente,
puedes hacer UNA<BR> $sql = $conexion->Prepare("SELECT *
FROM alumno WHERE rut_alumno = ?");<BR> $rs =
$conexion->Execute($sql,array('12345678-9'));<BR><BR>
juguemos_en_el_bosque();<BR><BR> // DOS<BR>
$sql = $conexion->Prepare("SELECT * FROM apoderado WHERE rut_alumno =
?");<BR> $rs =
$conexion->Execute($sql,array('12345678-9'));<BR><BR>
mientras_el_lobo_no_esta();<BR><BR> // TRES y más consultas en
el mismo script.<BR> $sql = $conexion->Prepare("SELECT *
FROM cuotas WHERE rut_alumno = ?");<BR> $rs =
$conexion->Execute($sql,array('12345678-9'));<BR><BR>
lobo_esta(?);<BR><BR> // Y antes de cerrar el script, la
conexión se cierra sola.<BR>
$conexion->Close();<BR><BR>
terminado();<BR><BR> exit();<BR>?><BR><BR>El ejemplito este
aprovecha una sola conexión no persistente, pero usando solamente "UN" script,
lo cual a pesar de que está bien, te ensucia un poco el código y te lo hace un
poquito ilegible, por todas esas SQL por aquí y por allá. OK, ahora vamos a
hacer un script para las funciones, un script para abrir y cerrar la conexión, y
tu script de lógica de negocios:<BR><BR><!-- conexion.php
--><BR><?php<BR> // nuestra función que nos abre muchas
puertas<BR> function abrir_conexion()<BR>
{<BR>
require_once('adodb/adodb.inc.php');<BR><BR>
$host = "123.123.123.123";<BR>
$user = "postgres";<BR>
$pass = "nula";<BR> $base = "carepescao";
<BR><BR> $conexion =
ADONewConnection("postgres");<BR>
$conexion->NConnect($host, $user, $pass, $base);<BR><BR>
if(!$conexion->IsConnected)<BR>
{<BR>
die("Arghhh mi jefe me va a matar! me pitié la conexión");<BR>
}<BR> }<BR><BR> // la
función que cierra con llave cuando nos vayamos ;)<BR>
function cerrar_conexion();<BR> {<BR>
if($conexion->IsConnected)<BR>
{<BR>
$conexion->Close();<BR> }
<BR> }<BR><BR>?><BR><BR><!-- leo
nuevamente:<BR>originalmente tu preguntaste por un "pool" de conexiones lo cual
es diferente ya que ahi se puede compartir conexiones <B
class=moz-txt-star><SPAN class=moz-txt-tag>*</SPAN>entre<SPAN
class=moz-txt-tag>*</SPAN></B> procesos, y eso en PHP se tiene que hacer con
ayuda externa.<BR>--><BR><BR>Nótese que compartir conexiones entre procesos
(pooling) tiene diferencias con aprovechar las conexiones no persistentes: lo
que vamos a hacer en el siguiente archivo aprovecha una conexión no persistente
que esté abierta, en vez de estar abriendo y cerrando. Esto para mí también es
llamado pooling, pero básico, y aunque no sea un proceso automatizado, así es
como trabaja... La idea es siempre tener una y sólo una conexión disponible
cuando la usemos sin tener que abrirla más que lo necesario, y cerrarla cuando
ya tengamos todas nuestras operaciones hechas y no vayamos a usarla de
inmediato, bien por estar requiriendo datos, bien por ya haberlos obtenido y
estamos mostrándolos en otra página. La cerramos para liberar recursos y así
optimizamos cualquier cantidad de memoria. Esta clase de pooling no comparte
conexiones entre procesos (para mí un proceso tiene un PID y tiene un destino
distinto).<BR><BR><!-- sql.php --><BR><?php<BR>
require_once 'conexion.php';<BR><BR> // una funcion que lo
unico que hace es retornar el recordset.<BR> function
buscar_alumno($rut)<BR> {<BR>
if(!$conexion->IsConnected ||
!isset($conexion))<BR>
{<BR>
abrir_conexion();<BR> }<BR>
$sql = $conexion->Prepare("SELECT * FROM alumno WHERE
rut_alumno = ?");<BR> $rs =
$conexion->Execute($sql,array($rut));<BR>
return $rs;<BR> }<BR><BR> // una funcion que
lo unico que hace es retornar el recordset.<BR> function
buscar_apoderado($rut)<BR> {<BR>
if(!$conexion->IsConnected ||
!isset($conexion))<BR>
{<BR>
abrir_conexion();<BR> }<BR>
$sql = $conexion->Prepare("SELECT * FROM apoderado WHERE
rut_alumno = ?");<BR> $rs =
$conexion->Execute($sql,array($rut));<BR>
return $rs;<BR> }<BR><BR> // una funcion que
lo unico que hace es retornar el recordset.<BR> function
buscar_cuotas($rut)<BR> {<BR>
si la conexión no existe, o no se ha seteado, entonces
abrimos la conexion. Si la conexion existe, para que?<BR>
if(!$conexion->IsConnected ||
!isset($conexion))<BR>
{<BR>
abrir_conexion();<BR>
}<BR> $sql = $conexion->Prepare("SELECT
* FROM cuotas WHERE rut_alumno = ?");<BR>
$rs = $conexion->Execute($sql,array($rut));<BR>
return $rs;<BR> }<BR>?><BR><BR><!--
bussiness.php --><BR><?php<BR> require_once
'conexion.php';<BR> require_once
'sql.php';<BR><BR> // abrimos la
conexion();<BR> abrir_conexion();<BR><BR> //
procesamos algunas cosas...<BR>
dibujemos();<BR><BR> // llamamos a nuestra
consulta.<BR> // esto ya es lógica de negocios, ¿no?
<BR> $resultado1 =
buscar_alumno($rut);<BR><BR> // tururururu, me gusta
cantar...<BR>
juguemos_en_el_bosque();<BR><BR> // nuestra logica de negocios
requiere que<BR> // busquemos al responsable por el cabro de
.. ;)<BR> $resultado2 =
buscar_apoderado($rut);<BR><BR> // el lobo andaba comiéndose
unas abuelitas por ahi<BR>
mientras_el_lobo_no_esta();<BR><BR> // de nuevo, no
necesitamos de SQL feos por ahi...<BR> $resultado3 =
buscar_cuotas($rut);<BR><BR> // mostramos los resultados en la
pantalla...<BR> lobo_esta(?);<BR><BR> //
cerramos la conexion...<BR>
cerrar_conexion();<BR><BR> // cerramos algunas otras cosillas,
o bien cargamos el footer, que se yo,<BR>
terminado();<BR><BR> // una vieja costumbre mía, heredada de
los antiguos BASIC de ATARI.<BR> // nadie me ha convencido de
que esto no es necesario<BR> exit();<BR>?><BR><BR>Como
puedes ver, finalmente son más archivos, pero el que te interesa que es la
lógica de negocios, te queda lindo para leer. La cosa es diseñar un poco más
ordenado. El que programes en 3, 4, 5 o 100 capas si quieres no significa que
las capas no se interconecten, pues la lógica de presentación necesita que la
lógica de negocios le pase datos, y la lógica de negocios necesita conectarse a
la base de datos, para que tenga algo que procesar!!!<BR>
<BLOCKQUOTE cite=mida9b983730602100539y487e39bau@mail.gmail.com
type="cite">Mil disculpas si soy muy pregunton, pero siempre me gusta sacar
conclusiones valiosas de las conversaciones.... Gracias de
antemano...<BR></BLOCKQUOTE>Cero dramas. Si Google no es claro en el asunto (de
hecho no lo fue cuando lo investigué) no hay problemas en discutirlo y aclarar
las dudas.<BR>
<BLOCKQUOTE cite=mida9b983730602100539y487e39bau@mail.gmail.com
type="cite">Nos leemos<BR>-----------------<BR>Juan
Pablo</BLOCKQUOTE></BODY></HTML>