• Publicidad

Conexiones abiertas en MySQL cuando lo uso con CGI::Session

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Conexiones abiertas en MySQL cuando lo uso con CGI::Session

Notapor hecoo » 2011-07-14 09:50 @451

Hola,

Estoy usando la biblioteca CGI::Session para autentificar usuarios usando un controlador de MySQL.

El problema que tengo es que cada vez que se autentifica alguien, veo en MySQL, que se realiza una conexión, pero no se libera en ningún momento.

El caso es que si dichas conexiones se van acumulando, llega un momento que alcanza el límite (por defecto 101 en MySQL) y da error del servidor en la siguiente.

La creación de la sesión la hago tras hacer login:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dbh
  2.     = DBI->connect(
  3.          "dbi:mysql:host=$webserver;database=$schema;tablename=sessions",
  4.          &GetDBUser(), &GetDBPassword() )
  5.     or die "Error de conexion a BBDD!"
  6.     ;
  7. my $session
  8.     =  new CGI::Session( 'driver:mysql', undef, { Handle => $dbh } )
  9.     or die CGI::Session->errstr
  10.     ;
  11.  
  12. $s_id = $session->id();
  13. $session->param( 'TGI', $login );
  14. $s_tgi = $session->param("TGI");
  15.  
  16. $session->expire('15m');
  17. $session->flush();
  18.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Para recoger el valor de la sesión (incluido en una función a la que todas las páginas acceden siempre al principio):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. CGI::Session->name("session");
  2.  
  3. my %cookies = CGI::Cookie->fetch;
  4.  
  5. if ( $cookies{'session'} ) {
  6.     $cookie_id = $cookies{'session'}->value;
  7. }
  8. else {
  9.     print "Location:$scriptsURL/login.cgi?url="
  10.         . $ENV{"HTTP_REFERER"} . "\n\n";
  11.     exit 0;
  12. }
  13.  
  14. my $dbh
  15.     = DBI->connect(
  16.     "dbi:mysql:host=$webserver;database=$schema;tablename=sessions",
  17.     &GetDBUser(), &GetDBPassword() )
  18.     or die "Error de conexion a BBDD!";
  19. my $session
  20.     = CGI::Session->load( "driver:mysql", $cookie_id, { Handle => $dbh } )
  21.     or die CGI::Session->errstr;
  22.  
  23. if ( $session->is_expired || $session->is_empty ) {
  24.     print "Location:$scriptsURL/login.cgi?url="
  25.         . $ENV{"HTTP_REFERER"} . "\n\n";
  26.     exit 0;
  27. }
  28.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El funcionamiento de las sesiones es el correcto, pero no entiendo que se queden abiertas las conexiones de la BBDD.

He visto en otro post que se pueden cerrar las sesiones vía JavaScript, pero mi duda va más al comportamiento de CGI::Session cuando usa MySQL.

Gracias por adelantado.
hecoo
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-07-14 07:58 @374

Publicidad

Re: Conexiones abiertas en MySQL cuando lo uso con CGI::Session

Notapor explorer » 2011-07-14 10:29 @479

Bienvenido a los foros de Perl en español, hecoo.

Yo te recomendaría que, en vez de crear el gestor de acceso a la base de datos usando el connect() del DBI, lo hicieras desde el propio new() de CGI::Session (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $session
  2.     =  new CGI::Session( 'driver:mysql', undef,
  3.        {
  4.            Host        => $webserver,
  5.            DataSource  => $schema,
  6.            TableName   => 'sessions',
  7.            User        => GetDBUser(),
  8.            Password    => GetDBPassword(),
  9.        }
  10.     or die CGI::Session->errstr
  11.     ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

(sacado de CGI::Session::Driver::mysql. Si no funciona con Host, incluirlo dentro del DataSource)

Según la documentación de CGI::Session::Driver::DBI, cuando se usa la opción de Handle, sirve para poder reutilizar conexiones ya abiertas anteriormente (con lo que es más rápido y se aprovechan recursos, pero te obliga a llevar un control de qué conexión le corresponde a qué sesión, antes de pasársela a Handle). Y no se cierra la conexión con la base de datos (porque se supone que será reutilizada más tarde).

En cambio, si se usa DataSource, la conexión a la base de datos se desconectará de forma automática cuando se termine el programa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Conexiones abiertas en MySQL cuando lo uso con CGI::Session

Notapor hecoo » 2011-07-14 11:45 @531

¡Muchas gracias por la bienvenida, explorer!

Ciertamente, sabía que pasaba algo con la mezcla de BBDD y sesiones que estaba haciendo, pero no había llegado a probar la opción que me has sugerido.

Con esto se soluciona mi problema, ya que no se mantienen abiertas las conexiones, con lo que ¡muchas gracias por está respuesta tan rápida y efectiva!

Por mi parte ya había desarrollado una alternativa algo más rústica y menos elegante que la de usar CGI::Session. Simplemente por compartirlo con toda la gente:
1.- Había sustituido la generación de id de sesión por una generación aleatoria de cifras hexadecimales, cogiendo la hora actual como referencia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Digest::MD5 qw(md5_hex);
  2. use Time::HiRes qw(time);
  3.  
  4. $session_id = md5_hex time();
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

2.- Tras esto, almacenaba en BBDD: id de sesión, identificador usuario, fecha de creación, fecha último acceso e IP
3.- Propagación del id de sesión

Esto en cuanto a la creación. Posteriormente, la comprobación de la sesión:

4.- Recogida de la cookie de sesión (CGI::Cookie)
5.- Validación, mediante consulta en BBDD, de la sesión y actualización de la fecha de último acceso

Como digo, esto me parecía menos elegante, pero me había servido momentáneamente para salir del paso.

Por lo tanto lo dicho, ¡¡muchas gracias!! :D
hecoo
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-07-14 07:58 @374


Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron