Sei sulla pagina 1di 19

Cookies y Sesiones PHP

Las cookies se pueden configurar para una larga vida útil, lo que significa que los datos
almacenados en una cookie se pueden almacenar durante meses, años. Las cookies, que tienen
sus datos almacenados en el cliente, funcionan sin problemas cuando tiene un clúster de
servidores web, mientras que las sesiones se almacenan en el servidor, lo que significa que en
uno de sus servidores web maneja la primera solicitud, los otros servidores web en su clúster no
tener la información almacenada.

Las sesiones se almacenan en el servidor, lo que significa que los clientes no tienen acceso a la
información que almacena sobre ellos; esto es particularmente importante si almacena cestas
de compras u otra información que no desea que sus visitantes puedan editar a mano
pirateando sus cookies. Los datos de sesión, almacenados en su servidor, no necesitan
transmitirse con cada página; los clientes solo necesitan enviar una identificación y los datos se
cargan desde el archivo local. Finalmente, las sesiones pueden tener el tamaño que desee
porque se llevan a cabo en su servidor, mientras que muchos navegadores web tienen un límite
sobre cuán grandes pueden ser las cookies para evitar que los sitios web maliciosos mastiquen
gigabytes de datos con información de cookies sin sentido.

Entonces, como puede ver, cada uno tiene sus propias ventajas, pero al final del día
generalmente se trata de una opción: ¿desea que sus datos funcionen cuando su visitante
regrese al día siguiente? Si es así, entonces su única opción son las cookies: si tiene información
particularmente sensible, su mejor opción es almacenarla en una base de datos, luego use la
cookie para almacenar un número de identificación para hacer referencia a los datos. Si no
necesita datos semipermanentes, generalmente se prefieren las sesiones, ya que son un poco
más fáciles de usar, no requieren que sus datos se envíen en su totalidad con cada página y
también se limpian tan pronto como su visitante cierra su navegador web.

Cookies

Una cookie, como ya se mencionó, es un pequeño archivo en el disco duro de su cliente que
contiene datos que ha solicitado que se almacenen. Algunos clientes configuran
específicamente su navegador para rechazar cookies, creyendo por una razón u otra que son
maliciosos, y no hay nada que pueda hacer al respecto: el navegador de esa persona no podrá
almacenar sus datos. Al crear cookies, usted especifica durante cuánto tiempo desea que sea
válido y, una vez hecho, la cookie permanece en su lugar hasta esa fecha, cuando "caduca".

Nota: ¿Son peligrosas las cookies? No, en absoluto: un sitio web solo puede leer los
datos almacenados, y solo puede almacenar una pequeña cantidad de datos. El único
peligro posible para las cookies es que pueden almacenar información sobre usted sin
que se dé cuenta: un sitio web puede realizar un seguimiento de la frecuencia con la que
visita, a qué horas visita, en qué banners hace clic, etc. Sin embargo, no pueden leer
número de tarjeta de crédito, ¡o cualquier cosa por el estilo!
Las cookies se envían automáticamente al servidor web (y PHP las recibe / analiza) cada vez que
un usuario lo visita. Eso significa que una vez que colocamos nuestra cookie, los navegadores de
nuestros visitantes nos enviarán automáticamente el contenido de esa cookie cada vez que vean
nuestro índice del tablero de mensajes, y PHP leerá el valor en la matriz superglobal $ _COOKIE.
Como las cookies se envían cada vez, es increíblemente importante no almacenar demasiada
información allí; realmente pueden desperdiciar mucho ancho de banda.

Lo bueno de las cookies es que están descentralizadas: no necesita preocuparse por crear bases
de datos para contener información o agregar y eliminar filas, simplemente almacene los datos
y verifique si están configurados. Como tal, las cookies son buenas para cualquier página en la
que tenga que manejar una pequeña cantidad de información, por lo general, esto implica las
preferencias del usuario. Por ejemplo, use cookies para almacenar cómo los usuarios desean
que se clasifique su índice del tablero de mensajes, en qué orden les gusta que se impriman sus
noticias, etc.

Si está almacenando información como su dirección de correo electrónico, probablemente


debería usar una base de datos; los datos como ese generalmente se almacenan durante largos
períodos de tiempo, mientras que las cookies suelen ser información más desechable. Dicho
esto, si está almacenando información personal en cookies, tómese el tiempo para cifrarla.
Sesiones

Las sesiones son una combinación de una cookie del lado del servidor y una cookie del lado del
cliente, con la cookie del lado del cliente que no contiene nada más que una referencia a los
datos correctos en el servidor. Por lo tanto, cuando el usuario visita el sitio, su navegador envía
el código de referencia al servidor, que carga los datos correspondientes.

Esto puede parecer un poco más torpe que simplemente tener una cookie del lado del cliente
con todos sus datos, pero hay algunas ventajas:

Su cookie del lado del servidor puede contener grandes cantidades de datos sin problemas; las
cookies del lado del cliente tienen un tamaño limitado

Su cookie del lado del cliente no contiene más que un pequeño código de referencia: como esta
cookie se pasa cada vez que alguien visita una página en su sitio, está ahorrando mucho ancho
de banda al no transferir grandes cookies del lado del cliente.

Los datos de la sesión son mucho más seguros: solo usted puede manipularlos, a diferencia de
las cookies del lado del cliente que todos pueden editar

También es importante tener en cuenta que las sesiones solo duran hasta que el usuario cierra
su navegador, mientras que las cookies se pueden configurar para que duren más. Sin embargo,
aparte de lo anterior, no hay mucha diferencia entre los datos de sesión y los datos de cookies
para la mayoría de los propósitos.
Elegir la opción adecuada

En su implementación predeterminada (como arriba), no debe usar sesiones en proyectos muy


grandes que puedan implementarse en múltiples servidores de equilibrio de carga. La razón
detrás de esto puede no ser aparente al principio, pero si recuerda, los datos de la sesión se
almacenan realmente en un archivo en la computadora de un servidor. Si un usuario visita su
sitio y su equilibrador de carga lo redirige a un servidor para una solicitud, ese servidor tiene sus
datos de sesión. La próxima vez que lean una página, es posible que su equilibrador de carga los
cambie a otro servidor, dejando sus datos de sesión originales en el servidor original. El segundo
servidor también puede guardar algunos datos de sesión propios.

¿El final resulto? Pierden su información a la mitad de su visita, y los datos que tiene están
fragmentados en sus servidores. Hay maneras de evitar este problema:

Use un sistema de archivos en red (NFS en Unix o el equivalente). Casi todos los
sistemas operativos le permiten conectarse a otras computadoras y leer / escribir sus
datos. Si tiene una fuente de datos de sesión compartida, podrá evitar el problema
anterior

Escriba su propia implementación de sesión que almacene datos en un medio que


pueda manejar y compartir entre todas las computadoras. Esto es complicado y
propenso a errores.

Use una base de datos para almacenar sus sesiones.


Utilizando Cookies

bool setcookie ( string name [, string value [, int expire [, string path [, string domain
[, int secure]]]]])

Tomando el ejemplo de ordenar un índice de un messageboard, sería necesario colocar una


cookie que mantenga la preferencia del usuario en la clasificación de mensajes, ya sea que lo
quieran primero, primero el más antiguo u ordenado alfabéticamente:

<? php

if (! isset ($ _ COOKIE ['Pedido'])) {

setcookie ("Pedidos", $ _POST ['ChangeOrdering'], time () + 31536000);

?>

<form method = "post" action = "mbprefs.php"> Reordenar mensajes:

<select name = "ChangeOrdering">

<option value = "DateAdded ASC"> Más antiguo primero </option>

<option value = "DateAdded DESC"> Más nuevo primero </option>

<option value = "Title ASC"> Por título, A-Z </option>

<option value = "Title DESC"> Por título, Z-A </option>

</select>

<input type = "submit" value = "Guardar configuración" />

</form>

El script se puede dividir en dos partes distintas: primero verificamos si una cookie está
configurada y, si no, usamos la función setcookie () para configurarla. Luego publicamos un
formulario que permite a los visitantes seleccionar cómo les gustaría su conjunto de pedidos.

La llamada a setcookie () debe ser anterior al formulario HTML debido a la forma en que funciona
la web.

HTTP opera enviando toda la información del "encabezado" antes de enviar la información del
"cuerpo". En el encabezado, envía cosas como el tipo de servidor (por ejemplo, "Apache"), el
tamaño de página (por ejemplo, "29019 bytes") y otros datos importantes. En el cuerpo, envía
el HTML real que ves en la pantalla. HTTP funciona de tal manera que los datos del encabezado
no pueden venir después de los datos del cuerpo: debe enviar todos los datos del encabezado
antes de enviar los datos del cuerpo.

Las cookies entran en la categoría de datos de encabezado: cuando coloca una cookie usando
setcookie (), su servidor web agrega una línea en sus datos de encabezado para esa cookie. Si
intenta enviar una cookie después de haber comenzado a enviar HTML, PHP marcará errores
graves y no se colocará la cookie.

Hay dos formas de corregir esto:

Coloque sus cookies cerca de la parte superior de su página. Al enviarlos antes de enviar
cualquier información del cuerpo, evita el problema por completo.

Habilite el almacenamiento en búfer de salida en PHP. Esto le permite enviar información de


encabezado, como cookies, donde desee, incluso después (o en el medio) de los datos del
cuerpo.

La función setcookie () en sí misma toma tres parámetros principales: el nombre de la cookie, el


valor de la cookie y la fecha de caducidad de la cookie.

Nota: Una cosa importante para recordar acerca de las cookies es que se envían al
servidor cada vez que un usuario visita una página. Por lo tanto, si configura una cookie
en un script, no estará disponible hasta que su usuario visite la siguiente página (o
presione actualizar); esto a menudo confunde a las personas que buscan
desesperadamente un error.

En el código de ejemplo, setcookie () establece una cookie llamada "Ordenar" en el valor


establecido en el formulario desde el cuadro SELECCIONAR desplegable, y utiliza

time () + 31536000

como su tercer parámetro, esto es igual a la hora actual en segundos más el número de segundos
en un año, lo que significa que la cookie está configurada para caducar un año desde el momento
en que se configuró.

Una vez establecida, la cookie de pedido se enviará con cada solicitud de página posterior, y PHP
la pondrá a disposición en $ _COOKIE. Tenga en cuenta que los usuarios pueden borrar sus
cookies manualmente, ya sea utilizando una opción especial en su navegador web o
simplemente eliminando archivos. También es importante tener en cuenta que las cookies son
enviadas por su visitante cuando se solicita la página; si configura la cookie durante el script PHP
que se solicita, no se habrá enviado con la solicitud, lo que significa que no será en $ _COOKIE:
¡esto es lo que se entiende por "cada solicitud de página posterior"!

Los últimos tres parámetros de la función setcookie () le permiten restringir cuándo se envía, lo
que le da un poco más de control.

El parámetro cuarto ("ruta") le permite establecer un directorio en el que la cookie está activa.
De forma predeterminada, esto es "/" (activo para todo el sitio), pero puede configurarlo en "/
messageboards /" para que la cookie solo esté disponible en ese directorio y sus subdirectorios.

El parámetro cinco ("dominio") le permite establecer un subdominio en el que la cookie está


activa. Por ejemplo, si especifica "mail.yoursite.com", la cookie estará disponible allí, pero no en
www.yoursite.com. Use ".yoursite.com" para que la cookie esté disponible en todas partes.

El parámetro seis ("seguro") le permite especificar si la cookie solo debe enviarse a través de
una conexión HTTPS o no. El valor predeterminado, "0", tiene la cookie enviada a través de
HTTPS y HTTP, pero puede establecerla en 1 para forzar solo HTTPS.
Usando sesiones

Las sesiones son excelentes para almacenar datos temporales sobre sus visitantes,
particularmente cuando no desea que se pueda acceder a esos datos desde fuera de su servidor.
El uso de sesiones anteriores a PHP 4.1 fue mucho más difícil de lo que es hoy en día: si está
acostumbrado a tener que usar funciones para establecer y desarmar variables de sesión, debe
prestar especial atención a este texto en las sesiones, porque las cosas han cambiado
sustancialmente como resultado de la matriz superglobal $ _SESSION.

Comenzando una sesión

bool session_start (void)

Una sesión es una combinación de un archivo del lado del servidor que contiene todos los datos
que desea almacenar y una cookie del lado del cliente que contiene una referencia a los datos
del servidor. El archivo y la cookie del lado del cliente se crean utilizando la función session_start
(); no tiene parámetros, pero informa al servidor que las sesiones se utilizarán.

Cuando llame a session_start (), PHP verificará si el visitante envió una cookie de sesión; si lo
hizo, PHP cargará los datos de la sesión. De lo contrario, PHP creará un nuevo archivo de sesión
en el servidor y enviará una identificación al visitante para asociarlo con el nuevo archivo. Debido
a que cada visitante tiene sus propios datos encerrados en su archivo de sesión único, debe
llamar a session_start () antes de intentar leer las variables de sesión; si no lo hace, simplemente
no tendrá acceso a sus datos. Además, como session_start () necesita enviar la cookie de
referencia a la computadora del usuario, debe tenerla antes del cuerpo de su página web,
incluso antes de cualquier espacio.

Agregar datos de sesión

Todos los datos de su sesión se almacenan en la matriz superglobal de sesión, $ _SESSION, lo


que significa que cada variable de sesión es un elemento en esa matriz, combinado con su valor.
Agregar variables a esta matriz se realiza de la misma manera que agregar variables a cualquier
matriz, con la ventaja añadida de que las variables de sesión aún estarán allí cuando su usuario
navegue a otra página.

Para establecer una variable de sesión, use una sintaxis como esta:

$ _SESSION ['var'] = $ val; $ _SESSION ['FirstName'] = "Jim";

Las versiones anteriores de PHP usaban la función session_register (), sin embargo, se
desaconseja el uso de esta función, ya que se elimina en las versiones modernas de PHP. Si tiene
scripts que usan session_register (), se recomienda encarecidamente que cambie al uso de la
superglobal $ _SESSION, ya que es más portátil y también más fácil de leer.
Antes de que pueda agregar cualquier variable a una sesión, debe haber llamado a la función
session_start ()

Nota: no puede almacenar recursos como conexiones de base de datos en sesiones, por
muy bueno que sea, porque estos recursos son exclusivos de cada script PHP y
generalmente se limpian cuando ese script finaliza. Si bien esto puede cambiar en el
futuro, no es probable.

Lectura de sesión

Una vez que haya guardado sus datos de manera segura, estarán disponibles de inmediato en la
matriz superglobal $ _SESSION con la clave del nombre de la variable que le dio. Aquí hay un
ejemplo de configuración de datos y lectura de nuevo:

<? php

$ _SESSION ['foo'] = 'bar';

print $ _SESSION ['foo'];

?>

A diferencia de las cookies, los datos de la sesión están disponibles tan pronto como se
configuran, lo que puede ser una gran ventaja.

Eliminar datos de sesión

Eliminar un valor específico de una sesión es tan simple como usar la función unset (), como lo
haría con cualquier otra variable. Es importante que desarme solo elementos específicos de la
matriz $ _SESSION, no la matriz $ _SESSION en sí, porque eso le dejaría sin ninguna forma de
manipular los datos de la sesión.

Para extender el script anterior para eliminar datos, use esto:

<?php

$_SESSION['foo'] = 'bar';

print $_SESSION['foo'];

unset($_SESSION['foo']);

?>
Finalizando una sesión

bool session_destroy (void)

Una sesión dura hasta que su visitante cierre su navegador; si navega fuera de otra página y
luego regresa a su sitio sin haber cerrado su navegador, su sesión seguirá existiendo. Este
comportamiento generalmente es deseable: potencialmente los datos de la sesión de su
visitante pueden durar días, siempre y cuando sigan navegando por su sitio, mientras que las
cookies generalmente tienen una vida útil fija.

Si desea finalizar explícitamente a un usuario y eliminar sus datos sin tener que cerrar su
navegador, debe borrar la matriz $ _SESSION, luego usar la función session_destroy ().
session_destroy () elimina todos los datos de sesión almacenados en su disco duro, dejándolo
con una pizarra limpia.

Para finalizar una sesión y limpiar sus datos, use este código:

<?php

session_start();

$_SESSION = array();

session_destroy();

?>

Hay dos cosas importantes a tener en cuenta allí: en primer lugar, se llama a session_start ()
para que PHP cargue la sesión del usuario, y en segundo lugar, usamos una llamada vacía a la
función array () para hacer que $ _SESSION sea una matriz vacía, limpiándola efectivamente. Si
no se llama a session_start (), ninguna de las siguientes dos líneas funcionará correctamente, así
que, de nuevo, ¡siempre llame a session_start ()!
Comprobación de datos de sesión

Puede verificar si una variable se ha establecido en la sesión de un usuario utilizando la función


isset (), como lo haría con una variable normal. Debido a que superglobal $ _SESSION solo se
inicializa una vez que se ha llamado a session_start (), debe llamar a session_start () antes de
usar isset () en una variable de sesión. Por ejemplo:

<? php

session_start ();

if (isset ($ _ SESSION ['Nombre'])) {

/// tu código aquí

?>

Por supuesto, también puede usar la función empty () con datos de sesión, o incluso cualquier
otra función: la matriz $ _SESSION y sus datos se pueden usar como cualquier otra matriz.
Archivos vs. bases de datos

bool session_set_save_handler (string open, string close, string read, string write, string
destroy, string garbage_collect)

El sistema de manejo de sesiones en PHP es bastante básico en su esencia, simplemente


almacenando y recuperando valores de archivos planos basados en ID de sesión únicas
distribuidas cuando se inicia una sesión. Si bien este sistema funciona muy bien para soluciones
a pequeña escala, no funciona demasiado bien cuando entran en juego varios servidores. El
problema se debe a la ubicación: ¿dónde deben almacenarse los datos de la sesión?

Si los datos de la sesión se almacenan en archivos, los archivos tendrían que estar en una
ubicación compartida en algún lugar, lo que no es ideal por razones de rendimiento o bloqueo.
Sin embargo, si los datos se almacenan en una base de datos, se puede acceder a esa base de
datos desde todas las máquinas en el clúster de servidores web, eliminando así el problema.
Afortunadamente para nosotros, el sistema de almacenamiento de sesiones de PHP fue
diseñado para ser lo suficientemente flexible como para hacer frente a esta situación.

Nota: También tenga en cuenta que PHP guarda sus datos de sesión en su directorio /
tmp de manera predeterminada, que generalmente puede leer cualquier persona que
tenga acceso a su servidor. Como resultado, tenga cuidado con lo que almacena en sus
sesiones o, mejor aún, ¡cambie la ubicación de guardado o use una base de datos con
controles de seguridad más precisos!

Para usar su propia solución en lugar de los controladores de sesión estándar, debe llamar a la
función session_set_save_handler (), que requiere una gran cantidad de parámetros. Para
manejar las sesiones, debe tener sus propias funciones de devolución de llamada que manejen
un conjunto de eventos, que son:

Sesión abierta (called by session_start())

Cierre de sesión (called at page end)

Lectura de sesión (called after session_start())

Escritura de sesión (llamada cuando se van a escribir los datos de sesión)


Destrucción de sesión (llamada por session_destroy ())

Recolección de basura de sesión (llamada randomly)

Para manejar estos seis eventos, debe crear seis funciones con números muy específicos de
funciones y tipos de retorno. Luego pasa estas seis funciones a session_set_save_handler () en
ese orden, y ya está todo listo. Pruebe el siguiente script: configura todas las funciones básicas
y luego imprime lo que se pasa a la función para que pueda ver cómo funcionan las operaciones
de la sesión:

<?php

function sess_open($sess_path, $sess_name) {

print "Session opened.\n";

print "Sess_path: $sess_path\n";

print "Sess_name: $sess_name\n\n";

return true;

function sess_close() {

print "Session closed.\n";

return true;

function sess_read($sess_id) {

print "Session read.\n";

print "Sess_ID: $sess_id\n";

return '';

function sess_write($sess_id, $data) {

print "Session value written.\n";

print "Sess_ID: $sess_id\n";


print "Data: $data\n\n";

return true;

function sess_destroy($sess_id) {

print "Session destroy called.\n";

return true;

function sess_gc($sess_maxlifetime) {

print "Session garbage collection called.\n";

print "Sess_maxlifetime: $sess_maxlifetime\n";

return true;

session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write",


"sess_destroy", "sess_gc");

session_start();

$_SESSION['foo'] = "bar";

print "Some text\n";

$_SESSION['baz'] = "wombat";

?>

Visualizar la salida en su navegador ¿?


Session opened.

Sess_path: /tmp

Sess_name: PHPSESSID

Session read.

Sess_ID: m4v94bsp45snd6llbvi1rvv2n5

PHP Warning: session_start(): Cannot send session cookie - headers already sent by
(output started at session.php:3) in session.php on line 39
PHP Warning: session_start(): Cannot send session cache limiter - headers already sent
(output started at session.php:3) in session.php on line 39

Some text

Session value written.

Sess_ID: m4v94bsp45snd6llbvi1rvv2n5

Data: foo|s:3:"bar";baz|s:6:"wombat";

Session closed.

Ignore las dos líneas sobre no poder enviar la cookie de sesión: el problema es que estamos
enviando texto a la pantalla solo para ver cómo funciona. Hay cuatro cosas importantes a tener
en cuenta en ese ejemplo:

Puede, si lo desea, ignorar los parámetros pasados a sess_open (). Vamos a utilizar una base de
datos para almacenar nuestros datos de sesión, por lo que no necesitamos los valores en
absoluto.

La escritura de datos se produce solo una vez, a pesar de que nuestras dos escrituras en la sesión
no son secuenciales: hay una declaración de "impresión" entre ellas.

La lectura de datos se realiza solo una vez y pasa la identificación de la sesión.

Todas las funciones devuelven verdadero excepto sess_read ()

El elemento 1 no es cierto si realmente le importa dónde le pide el usuario que guarde los
archivos. Si está utilizando su propio sistema de archivos de sesión, es posible que desee utilizar
$ sess_path cuando se transfiera; esta es su decisión.

Sin embargo, los ítems 2 y 3 son muy importantes, ya que muestran que PHP solo lee y escribe
su sesión una vez. Cuando escribe, le da la ID de sesión para escribir y todo el contenido de esa
sesión, y cuando lee solo le da la ID de sesión para leer y espera que devuelva el valor de datos
de la sesión completa.

El último elemento muestra que sess_read () es la función que necesita devolver un valor
significativo a PHP; todos los demás solo necesitan devolver verdadero, pero la lectura de datos
de una sesión debe devolver los datos o devolver una cadena vacía ''. '.
Nota: si devuelve verdadero o falso de la función de lectura de la sesión, es probable
que PHP se bloquee; siempre devuelve la cadena de sesión o una cadena vacía.

Utilizaremos MySQL como nuestro sistema de base de datos para datos de sesión usando las
mismas funciones que las anteriores, en esencia vamos a modificar el script para que realmente
funcione.

Primero, necesitamos crear una tabla para manejar los datos de la sesión, y así es como se verá:

CREATE TABLE sessions (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
SessionID CHAR(26), Data TEXT DEFAULT '', DateTouched INT);

El campo ID no es realmente necesario, ya que no es probable que necesitemos manipular la


base de datos a mano. Es mejor tenerlo y no necesitarlo que necesitarlo cuando no lo tenemos

Ahora, antes de probar el siguiente código, debe ajustar dos valores en su archivo php.ini:
session.gc_probability y session.gc_maxlifetime. El primero, junto con session.gc_divisor,
establece la probabilidad de que PHP active la limpieza de sesión con cada solicitud de página.
Por defecto, session.gc_probability es 1 y session.gc_divisor es 1000, lo que significa que
ejecutará la limpieza de sesión una vez cada 1000 scripts. Como vamos a probar nuestro script,
necesitará cambiar session.gc_probability a 1000, lo que nos dará una oportunidad 1000/1000
de ejecutar la rutina de recolección de basura; en otras palabras, siempre se ejecutará.

El segundo cambio para realizar es hacer que session.gc_maxlifetime sea un poco más bajo. Por
defecto son 1440 segundos (24 minutos), lo cual es demasiado tiempo para esperar para ver si
nuestra rutina de recolección de basura funciona. Establezca este valor en 20, lo que significa
que al ejecutar nuestro script de recolección de basura, deberíamos considerar que todo lo que
tenga más de 20 segundos de antigüedad no se puede usar y eliminar. Por supuesto, en los
scripts de producción, este valor debe volver a 1440 para que las personas no pierdan el tiempo
de sus sesiones antes de que puedan leer una página web simple.

Con eso, aquí está el nuevo script:

<?php

$db = mysqli_connect("localhost", "phpuser", "alm65z", "phpdb");

function sess_open($sess_path, $sess_name) {


return true;

function sess_close() {

return true;

function sess_read($sess_id) {

GLOBAL $db;

$result = mysqli_query($db, "SELECT Data FROM sessions WHERE SessionID =


'$sess_id';");

if (!mysqli_num_rows($result)) {

$CurrentTime = time();

mysqli_query($db, "INSERT INTO sessions (SessionID, DateTouched) VALUES


('$sess_id', $CurrentTime);");

return '';

} else {

extract(mysqli_fetch_array($result), EXTR_PREFIX_ALL, 'sess');

mysqli_query($db, "UPDATE sessions SET DateTouched = $CurrentTime WHERE


SessionID = '$sess_id';");

return $sess_Data;

function sess_write($sess_id, $data) {

GLOBAL $db;

$CurrentTime = time();

mysqli_query($db, "UPDATE sessions SET Data = '$data', DateTouched =


$CurrentTime WHERE SessionID = '$sess_id';");

return true;
}

function sess_destroy($sess_id) {

GLOBAL $db;

mysqli_query($db, "DELETE FROM sessions WHERE SessionID = '$sess_id';");

return true;

function sess_gc($sess_maxlifetime) {

GLOBAL $db;

$CurrentTime = time();

mysqli_query($db, "DELETE FROM sessions WHERE DateTouched +


$sess_maxlifetime < $CurrentTime;");

return true;

session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write",


"sess_destroy", "sess_gc");

session_start();

$_SESSION['foo'] = "bar";

$_SESSION['baz'] = "wombat";

?>

Debería ser inmediatamente evidente que ese script es lo mismo que antes con solo el contenido
de la función cambiado, ¡y el contenido de la función no es exactamente nada especial! Cuando
se inicia el script, forma una conexión con el servidor SQL local; esto se usa a través del script
para las funciones de manejo de sesión. Cuando se lee una sesión, se llama a sess_read () y se le
da la ID de sesión para leer. Esto se utiliza para consultar nuestra tabla de sesiones; si existe el
ID, se devuelve su valor. De lo contrario, se crea una fila de sesión vacía con ese ID de sesión y
se devuelve una cadena vacía. La fila vacía se coloca allí para que luego podamos decir
"ACTUALIZAR" mientras escribimos y no tengamos que molestarnos si la fila ya existe, ya que
sabemos que la creamos al leer. La función sess_write (): actualice la sesión con el ID $ sess_id
para que contenga los datos pasados con $ data.
La última función de interés es sess_gc (), que se llama aleatoriamente para manejar la
eliminación de la información de la sesión anterior. Por supuesto, editamos php.ini para que
"aleatoriamente" signifique "cada vez" en este momento, y esta función recibe la vida útil en
segundos de los datos de la sesión, y elimina todas las filas que no se han leído o actualizado en
ese momento. Podemos decir cuánto tiempo ha pasado desde la última vez que se leyó / escribió
una fila porque tanto sess_read () como sess_write () actualizan el campo DateTouched a la hora
actual. Por lo tanto, para saber si un registro no se tocó después del límite de tiempo de
recolección de basura, simplemente tomamos DateTouched y le agregamos el límite de tiempo
$ sess_maxlifetime: si ese valor está por debajo del tiempo actual, los datos de la sesión ya no
son válidos.

Es interesante notar que no necesita usar bases de datos o archivos para almacenar sus sesiones.
Puede definir el método de almacenamiento y recuperación para su sistema; si realmente lo
desea.

Las funciones de sesión de PHP están basadas en archivos de manera predeterminada y también
son bastante rápidas. PHP siempre lee en todo el archivo de sesión y también lo escribe en su
totalidad, lo que significa que PHP solo tiene que leer el archivo y escribir el archivo, nunca el
tipo de búsquedas y ediciones parciales.

Evaluar resultados….

Potrebbero piacerti anche