2011/05/26

Sesiones en PHP a lo campestre

Hola a todos, hoy toca ser un poco "bruto". En uno de mis desarrollos, me he encontrado con un bug de PHP de modo que al trabajar con ficheros en tiempo real, cada vez que abría la sesion son session_start() para leer los datos del usuario actual, se me bloqueaban los ficheros por lo que se el tempo real se me iba al garete y el tiempo re sespuesta al timeout.

En vez de desesperar, me las he ingeniado para realizar las operaciones que jace el session_start() a lo basto, leyendo directamente las sesiones desde disco y extrayendo los datos que necesitaba.

Aquí tenéis un ejemplo. Sed buenos, que os estoy vigilando ;)

El primer paso es recibir el session_id() bueno de la sesión que tengamos iniciada (suponemos que en algún momento hemos hecho un session_start() con éxito. Si no, mal vamos).

El session_id se puede obtener llamando a la función session_id() después de un session_start() o mediante la lectura de la cookie PHPSESSID mediante $_COOKIE['PHPSESSID']. En el ejemplo se puede pasar el is mediante el parámetro "sid" de la página o mediante la cookie.
// Obtiene el session_id
$sid = $_REQUEST['sid'];
if(!$sid) $sid = $_COOKIE['PHPSESSID'];
if(!$sid) die "Necesito un identificador de sesión!!!";

Ahora calculamos el nombre del fichero donde se almacena la sesión
// Lee los IDs desde los ficheros de la sesión
$fname = session_save_path() . "/sess_" . $sid;
$txt   = file_get_contents($fname);

Los ficheros son ficheros de texto con cada variable expresada sefún el formato
variable|tipo:longitud:"valor";

variable es el nombre de la variable
tipo es un carácter que indica el tipo de datos. por ejemplo las cadenas son la letra 's'
longitud es el número de caracteres del valor
valor es el valor de la variable de sesión
Así, vamos a leer el valor de las variables usando expresiones regulares
$res = preg_match('/variable\|s\:\d*\:\"(\d+)\";/i', $txt, $data);
if($res) $valor = $data[1];

No hay comentarios:

Publicar un comentario