Comunidad de diseño web y desarrollo en internet online

Balanceo y sesiones

Citar            
MensajeEscrito el 15 May 2011 06:16 pm
Muy buenas estoy probando de hacer una web con balanceo de carga y ya tengo configurados los pcs para que balanceen la carga, eso lo hace perfecto, pero el problema viene ahora con la web, dado que las sessiones no las carga, bueno cuando cambia de server se desloguea y loguea segun quiere, vaya que hace cosas raras... leyendo he visto que se puede hacer con NFS, pero no logro encontrar una guia paso a paso... tambien he visto que php tiene una funcion para guardarlo en mysql, pero lo veo mucho mas complejo y tampoco he encontrado nada que pinte del todo bien...
Alguien me puede guiar un poco... Gracias de antemano.

Por JotaeRe

96 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 May 2011 11:44 am
Tras mucho googlear, al final veo que lo mas recomendado es siempre guardar la session en la bd, pues me he puesto a ello, y funciona cuando hago un ejemplo sencillo, pero hago la prueba con un login, dentro del cual compruebo que el user y pass introducidos esten en la bd, pues bien en ese momento ya peta, bueno mas que petar, me hace bien el login, pero tras hacerme el login le digo que guarde los valores en la session y no los guarda aparece un Warning: mysql_query(): 4 is not a valid MySQL-Link resource in
El codigo que provoca el fallo es el siguiente:

Código PHP :

$bd = new basededatos();
$query = "SELECT * FROM usuarios WHERE id='{$usuario}'";
$resultado = $bd->consultar($query);
$bd->desconectar();
$_SESSION['login'] = true;
$_SESSION['usuario'] = $usuario;

El fichero donde tengo las funciones de bd el codigo es el siguiente:

Código PHP :

<?php
   Class basededatos {
      private $id_conect;
      
      public function __construct($host = 'localhost', $usuario = 'XXXX', $pass = 'XXXX', $bd = pruebas'){
         $id_conect = mysql_connect($host,$usuario,$pass);
         $bool = mysql_select_db($bd);
         if(!$id_conect || !$bool) throw new Exception("Error de conexion a la Base de Datos");
         else $this->id_conect = $id_conect;
      }
   
      public function consultar($query){
         $id_query = mysql_query($query);
         if($id_query) {
            $vector = array();
            $i = 0;
            while($fila = mysql_fetch_assoc($id_query)){
               $vector[$i] = $fila;
               ++$i;
            }
            return $vector;
         }
         else throw new Exception("Error de query");
      }
      
      public function sentencia($query){
         $id_query = mysql_query($query);
         if($id_query) return true;
         else throw new Exception("Error de query");
      }
      
      public function desconectar(){
         if (mysql_close($this->id_conect) == 0) throw new Exception("Error al desconectar");
      }   
   }
?>

El fichero de las sessiones en bd:

Código PHP :

<?php
class Session {
    public function __construct(){
        session_set_save_handler(array(&$this, 'open'),array(&$this, 'close'),array(&$this, 'read'),array(&$this, 'write'),array(&$this, 'destroy'),array(&$this, 'clean'));
        session_start();
    }
    public function open() {
        $this->mysql = mysql_connect('localhost', 'XXXX', 'XXXX');
        $bSeldb = mysql_select_db('pruebas', $this->mysql);
        if (!$bSeldb) {
            die ('Can\'t use Database : ' . mysql_error());
        }

    }
    public function write($id, $data) {
        $access = time();
        $id = mysql_real_escape_string($id);
        $access = mysql_real_escape_string($access);
        $data = mysql_real_escape_string($data);
        $sql = "REPLACE INTO sessions VALUES  ('$id', '$access', '$data')";
        return mysql_query($sql, $this->mysql) or die(mysql_error());
    }

    public function read($id) {
        $id = mysql_real_escape_string($id);
        $sql = "SELECT data FROM   sessions WHERE  id = '$id'";
        if ($result = mysql_query($sql, $this->mysql)) {
            if (mysql_num_rows($result)) {
                $record = mysql_fetch_assoc($result);
                return $record['data'];
            }
        }
        return '';
    }
    public function destroy($id) {
        $id = mysql_real_escape_string($id);
        $sql = "DELETE FROM   sessions WHERE  id = '$id'";
        return mysql_query($sql, $this->mysql);
    }
    public function clean($max) {
        $old = time() - $max;
        $old = mysql_real_escape_string($old);
        $sql = "DELETE FROM   sessions WHERE  access < '$old'";
        return mysql_query($sql, $this->mysql);
    }

    public function close() {
        mysql_close($this->mysql);
    }
}
?>


Alguna sugerencia???

Por JotaeRe

96 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 May 2011 12:31 pm
Por lo que se ve, al llamar al constructor de la clase basededatos, éste no logra conectar a la base de datos y de allí que cuando ejecutas el query te dice que no existe el recurso MySQL.

O lo datos de conexión están mal o tienes un error de sintaxis en __construct de la clase.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 16 May 2011 02:16 pm
Lo mas raro es que por separado me funcionan ambas cosas... es decir, hago consultas por separado a la bd y todo perfeto, creo un fichero de pruebas para guardar las sesiones de la bd y funciona perfecto, pero cuando lo pongo como os he comentado, me ejecuta las consultas de la bd, pero no me inserta los datos de la session en la bd, aunque si actualiza la fecha de la session...

Por JotaeRe

96 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 May 2011 02:29 pm
mmmm curioso... me acaba de funcionar, pero sin cerrar la conexion de la consulta a la bd, antes de guardar los datos en la session... es raro puesto que la conexion es distinta, asi que tendria que dar igual que cerrase esa conexion... con lo que imagino que el problema estara en el destructor...

Por JotaeRe

96 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.