"Si tú no trabajas por tus sueños, alguien te contratará para que trabajes por los suyos”

Steve Jobs

Afiliado
Dominios3Euros

Un programador debe saber trabajar con sesiones, sobretodo si desarrollas páginas web ya que soy muy útiles y muy necesarias.

Las sessiones en PHP se usan para pasar datos entre paginas del mismo servidor. Normalmente estos datos se guardan en ficheros en el servidor y si lo permite en el navegador en forma de cookie, por defecto esa cookie la llama PHPSESSID, aunque el programador lo puede cambiar.

Funciones de php para trabajar con sesiones

Puedes ver información y mas completa de estas funciones en manual oficial de php, yo aquí voy poniendo las que vamos utilizando.

funcion session_start()

Con esta función abrimos una session creandola o reanudando.

session_start();

Cuando crea una nueva sesion, también crea un fichero en el directorio sessiones de php con el nombre 'sess_idsession', el prefijo 'sess_' el que viene por defecto en la instalacion php, pero se puede cambiar, alguial que la ruta del directorio donde se guarda el fichero.

Cuando reanuda una session existe en el directorio. obtenermos los datos de $_SESSION. Si no tenemos activa ninguna session la variable GLOBAL $_SESSIONES esta vacía.

El concepto iniciar o reanudar lo hace internamente php, ya que si ejecutamos session start() internamente php comprueba si hay alguna y si no hay  genera una nueva.

Si forzamos el abrir una sesión existente, obtenemos los datos $_SESSION que tuviera ese fichero reanudado.

session_id('idsession');
session_start();

Ejecutando las funciones anterirores, es la forma forzar a reanudar una sesión existente, abriendo  la session_id('idsession'), recuerda que lógicamente tiene existir el fichero y tienes que tener permiso acceso ( tuvo que ser creado por el mismo usuario), ese fichero tiene el nombre con el prefijo sess_idsession.

Recuerda que script solo puede actuar sobre una session cada vez, por ello php guarda y cierra la session cada vez termine el script.

Realizando pruebas:

Como siempre tenemos que probar las cosas si funcionan, lo hacemos y ademas intentamos darle mas vuelta (nuestro mini hackeo).
Para poder hacer esto, creamos un pequeño script en php, lo publico github gist text-sessiones.php.

  1. - Abrir una sesión que existe en el servidor aunque no sea mismo cliente.
    Hemos probado a obtener sessiones de otros clientes que se conectaron al mismo servidor, en este caso de la aplicacion phpmyadmin. Lo primero, es saber idsession que utilizo, algo complejo si no tenemos acceso al servidor.
    Si tenemos idsession entonces podemos abrirlo desde otros script que este situado en mismo servidor, ya que el usuario de sistema es mismo para ambos. Asi de esa forma podermos ver $_SESSION de phpmyadmin de otros usuario que se conecto a nuestro servidor, por ejemplo.
    El tema obtener id_session  es complejo, en la función session_save_path, pongo un link de un posto que indica como lo hace , pero no es tan facil o del todo correcto.

  2. - Intentamos abrir una sesión que no existe
    Pues nada, abre la sesion con idSession que le indicamos , con los datos en $_SESSION vacio.

funcion session_id($idsession = ?)

Con está función obtenemos el idsession o se lo asignamos.

Para obtener o asignar con esta funcion se hace si lo ejecutamos antes iniciar o después iniciar session, es decir antes ejecutar session_start() o después ejectuar en scritp de php.

 

function session_save_path()

Con esta función obtenemos la ruta donde PHP guarda los ficheros con los datos de las sesiones, esta información la podemos cambiar y consultar también en php.ini.

 

funcion session_create_id($prefix =?)

Crea un nuevo id session.

Si le indicamos un prefix, sería prefijo que pone antes del nombre id, pero creamos que cambia el prefijo de tiene php (sess_) ya que ese se puede cambiar solo en la configuracion de php.

Es prefix , es un prefix despues sess_  y se obtiene todo el nombre con prefijo con la instruccion session_id(), por ejemplo

session_create_id('Prefijo_');
session_start();
echo session_id();

No mostraria : Prefijo_nuevoid

Y si hacemos ls del path sessiones, no apareceria sess_Prefijo_nuevoid

función session_destroy()

 Con esta funcion destruimos una session, la cuestion es que para poder ejecutarlo tenemos abrirla primero, tanto elimina los datos $_SESSION , como borrar el fichero sesion.

Ideal para echar fuera usuarios de tu sistema.

funcion session_get_cookie_params()

En el manual indica que podemos obtener los parametros de cookie, pero realmente lo que obtiene son los parametros de cookie de session pero los que tenemos asignados en php.ini

NO es lo que busco, por lo que descarto.

funcion session_set_save_handler

Con esta funcion establece una clase que se encarga de la gestion (crear,guardar,leer y modificar) la session.

Creo que es realmente la que debemos utilizar en nuestras aplicaciones.

Ver mas info en el manual de php.

Como hacemos para obtener los idsessiones abiertas.

 Como root de sistema desde terminal:

ls -ls /var/lib/php/sessions/

Nos lista los ficheros (sessiones) que tenemos activas en este momento en php, en sistema Linux, claro está. :-)

En este post que encontre el siguiente script:

<?php
$allSessions = [];
$sessionNames = scandir(session_save_path());

foreach($sessionNames as $sessionName) {
    $sessionName = str_replace("sess_","",$sessionName);
    if(strpos($sessionName,".") === false) { //This skips temp files that aren't sessions
        session_id($sessionName);
        session_start();
        $allSessions[$sessionName] = $_SESSION;
        session_abort();
    }
}
print_r($allSessions);

 La idea es muy buena, pero hay un problema a la hora ejecutar esto, son lo permisos.

Normalmente los permisos www-data en ese directorio no son ejecucion, los permite lectura y escritura pero los ficheros que genere ese usuario, por lo que el script anterior, solo funcionaria, si fuera www-data quien creara el director path para sessiones.