Saludos querida comunidad.
En primer lugar, quiero agradecerles por la gran recurso útil. Más de una vez he encontrado aquí muchas ideas interesantes y consejos prácticos.
El propósito de este artículo es resaltar los inconvenientes del uso de sesiones en PHP. Por supuesto, hay documentación sobre PHP y muchos ejemplos, y este artículo no pretende ser guía completa. Está diseñado para revelar algunos de los matices del trabajo con sesiones y proteger a los desarrolladores de pérdidas de tiempo innecesarias.
El ejemplo más común de uso de sesiones es, por supuesto, la autorización del usuario. Empecemos por la implementación más básica para ir desarrollándola poco a poco a medida que surjan nuevas tareas.
(Para ahorrar espacio y tiempo, limitaremos nuestros ejemplos solo a las funciones de sesión en sí, en lugar de crear aquí una aplicación de prueba completa con una hermosa jerarquía de clases, manejo integral de errores y otras cosas buenas).
Función startSession() ( // Si la sesión ya se inició, detenga la ejecución y devuelva TRUE // (el parámetro session.auto_start en el archivo de configuración php.ini debe estar deshabilitado; el valor predeterminado) if (session_id()) return true; else return session_start(); // Nota: Antes de la versión 5.3.0, la función session_start() devolvía TRUE incluso si había un error // Si está utilizando una versión anterior a la 5.3.0, realice una verificación adicional session_id() // después de llamar a la función session_start(). destroySession() ( if (session_id()) ( // Si hay sesión activa, eliminar cookies de sesión, setcookie(session_name(), session_id(), time()-60*60*24); // y destruye la sesión session_unset(); sesión_destroy(); ) )
Nota: Se da a entender que conocimiento básico El lector conoce las sesiones PHP, por lo que no cubriremos aquí el principio operativo de las funciones session_start() y session_destroy(). Las tareas de diseño del formulario de inicio de sesión y autenticación de usuario no están relacionadas con el tema del artículo, por lo que también las omitiremos. Permítanme recordarles que para identificar al usuario en cada solicitud posterior, en el momento de iniciar sesión exitosamente, necesitamos almacenar el identificador del usuario en una variable de sesión (llamada ID de usuario, por ejemplo), que estará disponible en todas las solicitudes posteriores dentro la vida de la sesión. También es necesario implementar el procesamiento del resultado de nuestra función startSession(). Si la función devuelve FALSO, muestra el formulario de inicio de sesión en el navegador. Si la función devolvió VERDADERO y existe una variable de sesión que contiene el identificador del usuario autorizado (en nuestro caso, ID de usuario), muestre la página del usuario autorizado (para obtener más información sobre el manejo de errores, consulte la adición con fecha 2013-06- 07 en el apartado de variables de sesión).
Hasta ahora todo ESTÁ CLARO. Las preguntas comienzan cuando es necesario implementar el control de inactividad del usuario (tiempo de espera de la sesión), permitir que varios usuarios trabajen simultáneamente en un navegador y también proteger las sesiones contra el uso no autorizado. Esto será discutido abajo.
Función startSession() ( // Tiempo de espera de inactividad del usuario (en segundos) $sessionLifetime = 300; if (session_id()) return true; // Establece la duración de la cookie ini_set("session.cookie_lifetime", $sessionLifetime); // Si el usuario Se establece el tiempo de espera de inactividad, establezca la duración de la sesión en el servidor // Nota: Para un servidor de producción, se recomienda preestablecer estos parámetros en el archivo php.ini if ($sessionLifetime) ini_set("session.gc_maxlifetime", $sessionLifetime if (session_start(); )) ( setcookie(session_name(), session_id(), time()+$sessionLifetime); devuelve verdadero; ) en caso contrario, devuelve falso)
Algunas aclaraciones. Como sabes, PHP determina qué sesión debe iniciarse mediante el nombre de la cookie enviada por el navegador en el encabezado de la solicitud. El navegador, a su vez, recibe esta cookie del servidor, donde la coloca la función session_start(). Si la cookie del navegador ha caducado, no se enviará en la solicitud, lo que significa que PHP no podrá determinar qué sesión iniciar y lo tratará como si estuviera creando una nueva sesión. El parámetro de configuración de PHP session.gc_maxlifetime, que se establece igual al tiempo de espera de inactividad de nuestro usuario, establece la vida útil de una sesión de PHP y está controlado por el servidor. El control de la duración de la sesión funciona de la siguiente manera (aquí consideramos un ejemplo de almacenamiento de sesiones en archivos temporales como la opción más común y predeterminada en PHP).
Cuando se crea una nueva sesión, se crea un archivo llamado sess_ en el directorio establecido como directorio de almacenamiento de la sesión en el parámetro de configuración de PHP session.save_path
Nota: Cabe señalar aquí que el parámetro session.gc_maxlifetime se aplica a todas las sesiones dentro de un servidor (más precisamente, dentro de un proceso PHP principal). En la práctica, esto significa que si se ejecutan varios sitios en el servidor y cada uno de ellos tiene su propio tiempo de espera de inactividad del usuario, configurar este parámetro en uno de los sitios conducirá a su configuración para otros sitios. Lo mismo se aplica al hosting compartido. Para evitar esta situación, se utilizan directorios de sesión separados para cada sitio dentro del mismo servidor. La configuración de la ruta al directorio de sesiones se realiza utilizando el parámetro session.save_path en el archivo de configuración php.ini o llamando a la función ini_set(). Después de esto, las sesiones de cada sitio se almacenarán en directorios separados y el parámetro session.gc_maxlifetime establecido en uno de los sitios solo será válido para su sesión. No consideraremos este caso en detalle, especialmente porque tenemos una opción más flexible para monitorear la inactividad del usuario.
Para resolver este problema, abandonaremos el uso de mecanismos PHP integrados e introduciremos varias variables de sesión nuevas que nos permitirán controlar nosotros mismos el tiempo de inactividad del usuario.
Función startSession($isUserActivity=true) ( $sessionLifetime = 300; if (session_id()) return true; // Establece la duración de la cookie antes de cerrar el navegador (controlaremos todo en el lado del servidor) ini_set("session. cookie_lifetime", 0) ; if (! session_start()) return false; $t = time(); if ($sessionLifetime) ( // Si el tiempo de espera de inactividad del usuario está configurado, // verifica el tiempo transcurrido desde la última actividad del usuario // (hora de la última solicitud) cuando se actualizó la variable de sesión de última actividad) if (isset($_SESSION["lastactivity"]) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( // Si la el tiempo transcurrido desde la última actividad del usuario, // es mayor que el tiempo de espera de inactividad, lo que significa que la sesión ha expirado y es necesario finalizarla destroySession(); else ( // Si el tiempo de espera aún no ha transcurrido, // y si la solicitud surgió como resultado de la actividad del usuario, // actualiza la variable lastactivity con el valor de la hora actual, // extendiendo así el tiempo de la sesión en otros segundos de sessionLifetime if ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) devuelve verdadero; )
Resumamos. En cada solicitud comprobamos si se ha alcanzado el tiempo de espera desde la última actividad del usuario hasta el momento actual, y si se ha alcanzado destruimos la sesión e interrumpimos la ejecución de la función, devolviendo FALSE. Si no se ha alcanzado el tiempo de espera y se pasa el parámetro $isUserActivity con el valor TRUE a la función, actualizamos la hora de la última actividad del usuario. Todo lo que tenemos que hacer es determinar en el script de llamada si la solicitud es el resultado de la actividad del usuario y, en caso contrario, llamar a la función startSession con el parámetro $isUserActivity establecido en FALSE.
Actualización del 2013-06-07Procesando el resultado de la función sessionStart()
Los comentarios señalaron que devolver FALSE no proporciona una comprensión completa de la causa del error, y esto es absolutamente justo. No publiqué aquí el manejo detallado de errores (la extensión del artículo ya es bastante larga), ya que no está directamente relacionado con el tema del artículo. Pero dados los comentarios, lo aclararé.
Como puede ver, la función sessionStart puede devolver FALSO en dos casos. O la sesión no se pudo iniciar debido a algunos errores internos del servidor (por ejemplo, configuración de sesión incorrecta en php.ini) o la vida útil de la sesión expiró. En el primer caso debemos redirigir al usuario a una página con un error indicando que hay problemas en el servidor y un formulario para contactar con soporte. En el segundo caso, debemos transferir al usuario al formulario de inicio de sesión y mostrar en él el mensaje correspondiente indicando que la sesión ha caducado. Para hacer esto, necesitamos ingresar códigos de error y devolver el código correspondiente en lugar de FALSO, y en el método de llamada, verificarlo y actuar en consecuencia.
Ahora, incluso si todavía existe una sesión en el servidor, se destruirá la primera vez que se acceda a ella si el tiempo de espera de inactividad del usuario ha expirado. Y esto sucederá independientemente de la duración de la sesión establecida en la configuración global de PHP.
Nota:¿Qué sucede si se cierra el navegador y la cookie del nombre de la sesión se destruye automáticamente? La solicitud al servidor la próxima vez que se abra el navegador no contendrá las cookies de sesión y el servidor no podrá abrir la sesión y comprobar el tiempo de espera de inactividad del usuario. Para nosotros, esto equivale a crear una nueva sesión y no afecta la funcionalidad ni la seguridad de ninguna manera. Pero surge una pregunta justa: ¿quién destruirá la sesión anterior, si hasta ahora la hemos destruido después de que expirara el tiempo de espera? ¿O ahora quedará colgado en el directorio de sesiones para siempre? Para limpiar sesiones antiguas en PHP, existe un mecanismo llamado recolección de basura. Se ejecuta en el momento de la siguiente solicitud al servidor y borra todas las sesiones antiguas según la fecha de la última modificación de los archivos de sesión. Pero el mecanismo de recolección de basura no comienza con cada solicitud al servidor. La frecuencia (o más bien, la probabilidad) de inicio está determinada por dos parámetros de configuración session.gc_probability y session.gc_divisor. El resultado de dividir el primer parámetro por el segundo es la probabilidad de iniciar el mecanismo de recolección de basura. Por lo tanto, para que el mecanismo de limpieza de sesiones se inicie con cada solicitud al servidor, estos parámetros deben establecerse en valores iguales, por ejemplo "1". Este enfoque garantiza un directorio de sesión limpio, pero obviamente es demasiado costoso para el servidor. Por lo tanto, en los sistemas de producción, el valor predeterminado de session.gc_divisor se establece en 1000, lo que significa que el mecanismo de recolección de basura se ejecutará con una probabilidad de 1/1000. Si experimenta con estas configuraciones en su archivo php.ini, puede notar que en el caso descrito anteriormente, cuando el navegador cierra y borra todas sus cookies, todavía quedan sesiones antiguas en el directorio de sesiones por un tiempo. Pero esto no debería preocuparte, porque... Como ya hemos dicho, esto no afecta en modo alguno a la seguridad de nuestro mecanismo.
Actualización del 2013-06-07Evitar que los scripts se congelen debido al bloqueo del archivo de sesión
En los comentarios se planteó el problema de que los scripts que se ejecutan simultáneamente se congelan debido al bloqueo del archivo de sesión (la opción más llamativa es la encuesta larga).
Para empezar, observo que este problema no depende directamente de la carga del servidor ni de la cantidad de usuarios. Por supuesto que más solicitudes, más lento se ejecutan los scripts. Pero esta es una dependencia indirecta. El problema aparece solo dentro de una sesión, cuando el servidor recibe varias solicitudes en nombre de un usuario (por ejemplo, una de ellas es una encuesta larga y el resto son solicitudes regulares). Cada solicitud intenta acceder al mismo archivo de sesión y, si la solicitud anterior no desbloqueó el archivo, la siguiente se quedará esperando.
Para mantener el bloqueo del archivo de sesión al mínimo, se recomienda cerrar la sesión llamando a la función session_write_close() inmediatamente después de que se hayan completado todas las acciones con variables de sesión. En la práctica, esto significa que no debes almacenar todo en variables de sesión y acceder a ellas durante la ejecución del script. Y si necesita almacenar algunos datos de trabajo en variables de sesión, léalos inmediatamente cuando comience la sesión, guárdelos en variables locales para su uso posterior y cierre la sesión (es decir, cierre la sesión usando la función session_write_close y no destruyéndola usando session_destroy ).
En nuestro ejemplo, esto significa que inmediatamente después de abrir una sesión, comprobar su vida útil y la existencia de un usuario autorizado, debemos leer y guardar todos los datos adicionales. requerido por la aplicación variables de sesión (si existen), luego cierre la sesión usando una llamada a session_write_close() y continúe ejecutando el script, ya sea una encuesta larga o una solicitud regular.
¿Por qué fue esto posible? Obviamente, porque el nombre y el identificador de sesión son siempre los mismos durante toda la vida de la sesión, y si recibe estos datos, puede enviar fácilmente solicitudes en nombre de otro usuario (por supuesto, durante la vida de esta sesión). Puede que este no sea el tipo de ataque más común, pero en teoría parece bastante factible, especialmente considerando que un troyano de este tipo ni siquiera necesita derechos de administrador para robar las cookies del navegador del usuario.
¿Cómo puedes protegerte de ataques de este tipo? Nuevamente, obviamente, limitando la vida útil del identificador de sesión y cambiando periódicamente el identificador dentro de la misma sesión. También podemos cambiar el nombre de la sesión eliminando por completo la anterior y creando una nueva sesión, copiando en ella todas las variables de sesión de la anterior. Pero esto no afecta la esencia del enfoque, por lo que por simplicidad nos limitaremos únicamente al identificador de sesión.
Está claro que cuanto más corta sea la vida útil del ID de sesión, menos tiempo tendrá un atacante para obtener y utilizar cookies para falsificar una solicitud de usuario. Lo ideal sería utilizar un nuevo identificador para cada solicitud, lo que minimizará la posibilidad de utilizar la sesión de otra persona. Pero consideraremos el caso general en el que el tiempo de regeneración del identificador de sesión se establece de forma arbitraria.
(Omitiremos la parte del código que ya se ha comentado).
Función startSession($isUserActivity=true) ( // Vida útil del identificador de sesión $idLifetime = 60; ... if ($idLifetime) ( // Si la vida útil del identificador de sesión está configurada, // verifique el tiempo transcurrido desde que se inició la sesión creado o la última regeneración // (hora de la última solicitud cuando se actualizó la variable de sesión hora de inicio) if (isset($_SESSION["starttime"])) (if ($t-$_SESSION["starttime"] >= $ idLifetime) ( // Hora en que la vida del identificador de sesión ha expirado // Genera un nuevo identificador session_regenerate_id(true); $_SESSION["starttime"] = $t) ) else ( // Llegamos aquí si la sesión acaba de crearse // Establezca el tiempo de generación del identificador de sesión en tiempo actual$_SESSION["hora de inicio"] = $t; ) ) devuelve verdadero; )
Entonces, al crear una nueva sesión (que ocurre cuando el usuario inicia sesión exitosamente), configuramos la variable de sesión starttime, que almacena la hora de la última generación del identificador de sesión, en un valor igual a la hora actual del servidor. A continuación, en cada solicitud comprobamos si ha pasado suficiente tiempo (idLifetime) desde la última generación del identificador y, en caso afirmativo, generamos uno nuevo. Por lo tanto, si durante la vida útil establecida del identificador el atacante que recibió la cookie del usuario autorizado no tiene tiempo para usarla, el servidor considerará la solicitud falsa como no autorizada y el atacante será llevado a la página de inicio de sesión. .
Nota: La nueva ID de sesión ingresa a la cookie del navegador cuando se llama a la función session_regenerate_id(), que envía la nueva cookie, similar a la función session_start(), por lo que no necesitamos actualizar la cookie nosotros mismos.
Si queremos que nuestras sesiones sean lo más seguras posible, basta con establecer la vida útil del identificador en uno o incluso eliminar la función session_regenerate_id() entre paréntesis y eliminar todas las comprobaciones, lo que conducirá a la regeneración del identificador en cada pedido. (No he probado el impacto de este enfoque en el rendimiento, y solo puedo decir que la función session_regenerate_id(true) esencialmente realiza solo 4 acciones: generar un nuevo identificador, crear un encabezado con la cookie de sesión, eliminar el anterior y crear un nuevo archivo de sesión).
Digresión lírica: Si el troyano resulta ser tan inteligente que no envía cookies al atacante, sino que organiza el envío de una solicitud falsa previamente preparada inmediatamente después de recibir la cookie, lo más probable es que el método descrito anteriormente no pueda proteger contra tales un ataque, porque entre el momento en que el troyano recibe la cookie y el envío de la solicitud falsa prácticamente no habrá diferencia, y existe una alta probabilidad de que en ese momento no se regenere el identificador de sesión.
En nuestros ejemplos anteriores, no especificamos explícitamente un nombre de sesión, por lo que se utilizó el nombre PHP predeterminado (PHPSESSID). Esto significa que todas las sesiones que hemos creado hasta ahora han enviado una cookie al navegador con el nombre PHPSESSID. Evidentemente, si el nombre de la cookie es siempre el mismo, entonces no hay forma de organizar dos sesiones con el mismo nombre dentro del mismo navegador. Pero si usáramos nuestro propio nombre de sesión para cada usuario, el problema se solucionaría. Hagámoslo.
Función startSession($isUserActivity=true, $prefix=null) ( ... if (session_id()) return true; // Si el prefijo de usuario se pasa en los parámetros, // establece un nombre de sesión único que incluya esto prefijo, // de lo contrario establece un nombre común para todos los usuarios (por ejemplo, MIPROYECTO) session_name("MYPROJECT".($prefix ? "_".$prefix: "")); ini_set("session.cookie_lifetime", 0); si (! session_start()) devuelve falso;
Ahora todo lo que queda es asegurarse de que el script de llamada pase un prefijo único para cada usuario a la función startSession(). Esto se puede hacer, por ejemplo, pasando un prefijo en los parámetros GET/POST de cada solicitud o mediante una cookie adicional.
Función startSession($isUserActivity=true, $prefix=null) ( $sessionLifetime = 300; $idLifetime = 60; if (session_id()) devuelve verdadero; session_name("MYPROJECT".($prefix ? "_".$prefix: "")); ini_set("session.cookie_lifetime", 0); if (! session_start()) devuelve falso; $t = time(); if ($sessionLifetime) ( if ($_SESSION["lastactivity"] ) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( destroySession(); return false; ) else ( if ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) if ($idLifetime ) ( if (isset($_SESSION["starttime"])) ( if ($t-$_SESSION["starttime"] >= $idLifetime) ( session_regenerate_id(true); $_SESSION["starttime"] = $t; ) ) else ( $_SESSION["starttime"] = $t; ) ) devuelve verdadero; función destroySession() ( if (session_id()) ( session_unset(); setcookie(session_name(), session_id(), time() -60* 60*24); sesión_destroy();
Espero que este artículo ahorre algo de tiempo para aquellos que nunca han profundizado demasiado en el mecanismo de sesión y brinde suficiente información sobre este mecanismo para aquellos que recién están comenzando a familiarizarse con PHP.
7.7KMediante el uso Sesiones PHP el servidor te identifica y te permite realizar las operaciones necesarias: cambiar información en varias páginas web, añadir nueva información, etc. Después de terminar de trabajar en el sitio, elimina la sesión actual haciendo clic en el botón "Cerrar sesión":
Una sesión PHP es una forma de almacenar información en variables de sesión que se pueden usar para la autenticación en múltiples páginas web. A diferencia de las cookies, la información de la sesión no se almacena en el ordenador del usuario. En cambio, la sesión crea un archivo en el servidor en un directorio temporal.
Esta información, almacenada durante toda la sesión, está disponible para todas las páginas web del recurso. En el servidor, la ubicación del archivo temporal está determinada por el parámetro session.save_path en el archivo de configuración php.ini.
Al crear una sesión PHP, se realizan los siguientes tres pasos:
Estas configuraciones ayudan al script PHP a recuperar los valores de las variables de sesión del archivo. Del lado del cliente, PHPSESSID contiene el identificador de sesión. Confirma el nombre del archivo que se buscará en un directorio específico del lado del servidor, del cual se pueden extraer las variables de sesión y utilizarlas para la verificación.
El usuario puede finalizar la sesión haciendo clic en el botón de cerrar sesión, que llama a la función session_destroy(). Cuando el usuario cierra el navegador, la sesión PHP se cierra automáticamente. De lo contrario, el servidor finalizará la sesión después del período de tiempo especificado.
Cuando PHP autoriza a través de una sesión, se crea usando la función session_start() y se elimina usando la función session_destroy(). Global variable PHP, conocido como $_SESSION, se utiliza para establecer los valores de las variables de sesión. Puede restablecer todos los valores establecidos para las variables de sesión utilizando la función session_unset().
Veremos las siguientes operaciones usando una sesión PHP, así como ejemplos de ellas.
Resultado: ejecutar el código PHP anterior en el servidor producirá el siguiente mensaje:
Resultado: cuando ejecutamos el código PHP anterior en el servidor, obtendremos el siguiente mensaje como resultado. Se muestran los valores de las variables de sesión que configuramos anteriormente después de crear la sesión PHP.
Puede imprimir una matriz de variables de sesión y sus valores usando la función print_r($ _SESSION), como se muestra a continuación:
Resultado: cuando ejecutamos el código PHP anterior en el servidor, recibiremos el siguiente mensaje. Contendrá una serie de variables de sesión con sus nuevos valores.
¿Necesitas un nombre de usuario y contraseña?
Para enviar artículos en línea y verificar el estado de los artículos enviados, debe registrarse e iniciar sesión en su cuenta.
Como parte del proceso de envío de artículos, los autores deben verificar que su artículo cumpla con todos los siguientes puntos; los artículos podrán ser devueltos a los autores si no cumplen con estos requisitos.
El artículo ha sido preparado de acuerdo con los requisitos.
Los autores conservan los derechos de autor del trabajo y otorgan a la revista los derechos de primera publicación junto con el trabajo, mientras lo otorgan bajo los términos de la Licencia de Atribución Creative Commons, que permite a otros redistribuirlo. este trabajo con indicación obligatoria de la autoría de este trabajo y enlace a la publicación original en esta revista.
Nombres y direcciones Correo electrónico, ingresado en el sitio web de esta revista se utilizará únicamente para los fines designados por esta revista y no se utilizará para ningún otro propósito ni se proporcionará a otras personas u organizaciones.
Antes de registrarse en el sistema, el usuario acepta la política de tratamiento y almacenamiento de datos personales.
1500 caracteres con espacios: 300,00 (RUB)
Publicación de 1 página de manuscrito (1500 caracteres) - 300 rublos. Los materiales gráficos / tablas se pagan por separado: 50 rublos / 1 pieza. La copia del autor, incluido el envío dentro de Rusia, se paga a petición del autor: 400 rublos. Envío al extranjero: 800 rublos. El costo de enviar un certificado de aceptación del material para publicación es de 150 rublos.
Traducción de la información adjunta (nombre completo, lugar de trabajo de los autores; título; resumen; palabras clave) en idioma en Inglés 0,5 rublos por cada carácter, incluidos los espacios.
¡Atención! Los autores (candidatos y doctores en ciencias) que, según elibrary.ru, tienen 300 o más citas (la proporción de autocitas no debe ser más del 30%) se publican de forma gratuita. Si es elegible para la publicación gratuita, al enviar material, en el campo de comentarios, indique un enlace a su perfil de biblioteca con el número de citas. Los gastos de envío de la colección se pagan por separado.
Las sesiones en PHP son un mecanismo para almacenar información sobre la computadora del cliente en el lado del servidor. De hecho, las sesiones en PHP no son un tema tan complejo, pero para entenderlo es necesario saber cómo funcionan las cookies en PHP. Entonces, si no sabes cómo funcionan las cookies en PHP, lee primero el artículo correspondiente y luego regresa aquí.
La palabra sesión se traduce del inglés como sesión, por lo que el significado mismo de sesiones en PHP se vuelve más claro, pero los programadores han adoptado el término "sesiones" y lo usaremos en este artículo.
Las sesiones en PHP son muy similares al mecanismo de cookies, los mismos pares clave => valor, solo que se almacenan en el lado del servidor.
Necesitamos iniciar la sesión, para ello existe la función session_start(). Esta función inicia una sesión, o sesión, como quieras llamarla.
Es recomendable llamar a la función session_start() al principio de la página, pero en mis ejemplos no hago esto.
Las sesiones son grupos de variables que se almacenan en el servidor pero que se refieren a un visitante único. De nuevo, este es el punto clave: Las sesiones se almacenan en el servidor..
Para asegurar la interacción de cada visitante con sus datos de su sesión, utilizamos Galleta, el comando para crear que PHP proporciona solo, no necesitas preocuparte por eso. Esta cookie sólo es relevante para el servidor y no se puede utilizar para obtener datos del usuario.
En el servidor, los datos de la sesión se almacenan en un archivo de texto y están disponibles en el programa PHP en la matriz $_SESSION. Para guardar una variable en una sesión, debe asignarle un valor en esta matriz.
Finalmente comencemos a usar ejemplos. Todo es muy sencillo.
Ahora intentemos obtener el valor de la matriz $_SESSION en otro ejemplo.
Tenga en cuenta que si en el segundo ejemplo eliminamos la función session_start() entonces no tendremos acceso a los datos en la matriz $_SESSION.
Una vez que se crea una sesión, automáticamente tiene acceso al identificador único de la sesión usando la función session_id(). Esta función le permite configurar y obtener el valor de ID de sesión.
Puede buscar en la barra de herramientas de desarrollador de su navegador (en Chrome, presione Ctrl + Shift + I, luego Recursos, y encontrará una cookie allí), este dominio ha configurado una cookie para su navegador con el nombre PHPSESSID y aproximadamente lo siguiente valor: “7g5df9rkd1hhvr33lq1k6c72p7”.
Es por el valor PHPSESSID que el servidor determinará su navegador y trabajará con el conjunto correspondiente de variables que estarán disponibles para el script a través de la matriz $_SESSION, como se escribió anteriormente.
Mientras que la función session_id() le permite obtener el valor de ID de la sesión, la función session_name() le permite obtener el nombre de la sesión.
Ahora sabemos más sobre cómo funcionan las sesiones en PHP y necesitamos volver a la función session_start() una vez más. Esta función inicializa el mecanismo de sesión para el usuario actual. ¿Cómo sucede esto exactamente?
Ahora veremos un ejemplo que nos permitirá realizar pequeños experimentos con sesiones.
Has abierto una página en la sesión actual.=$_SESSION["count"]?>una vez.
Abra el ejemplo en ">esta pestaña.
Todo el trabajo de la sesión se basa en la matriz $_SESSION, esto es claramente visible en este ejemplo.
Si cierras la ventana del navegador, la sesión finalizará y nuestro contador se pondrá a cero. Este comportamiento de las sesiones en PHP se puede cambiar; volveremos a este tema un poco más adelante en el artículo.
Para finalizar la sesión necesitamos:
Puede borrar la matriz $_SESSION usando la función session_unset().
La función session_destroy() elimina el almacenamiento temporal en el servidor. Por cierto, ella no hace nada más.
Debe eliminar una cookie de sesión usando la función setcookie(), que aprendimos en la lección sobre cómo trabajar con cookies en PHP.
Ejemplo de finalizar una sesión:
La sesión ha terminado.
Ahora puede realizar un experimento: ejecute un ejemplo con un contador en una ventana, aumente el contador y luego ejecute el ejemplo eliminando la sesión y actualice la página con el contador nuevamente.
Puede eliminar un archivo de cookies como este:
setcookie(nombre_sesión(), "", tiempo() - 60*60*24*32, "/")
Las funciones session_name() y session_id() rara vez se utilizan en la práctica, pero escribo sobre ellas porque el artículo necesita revelar el mecanismo mismo de cómo funcionan las sesiones en PHP.
Puede utilizar estas funciones para definir sus propios nombres e ID de sesión, pero no se recomienda. Si desea configurarlas, escriba estas funciones con argumentos antes de la función session_start(), como en el siguiente ejemplo:
Con este ejemplo, a todos los usuarios se les asignará el mismo ID de sesión.
Echemos un vistazo más de cerca: si ejecuta el ejemplo de la sección sobre la función session_name() (aquí está el enlace) en diferentes navegadores (por ejemplo, Chrome e Internet Explorer), cada navegador tendrá su propio identificador de sesión único. . Los navegadores almacenan cookies cada uno en su propia carpeta, por lo que la función session_start() permitirá que cada navegador cree su propio identificador único y, en consecuencia, se creará un almacenamiento único para cada navegador en el servidor. Por lo tanto, el ejemplo del contador (este) funcionará de forma independiente en cada navegador.
Si configura el mismo ID de sesión para todos los usuarios, trabajarán con el mismo almacenamiento en el servidor. A continuación se muestra un ejemplo de un contador que contará las visitas de diferentes navegadores:
100) ( session_unset(); session_destroy(); )?>
Abrió la página en diferentes navegadores.=$_SESSION["count"]?>una vez.
Abra el ejemplo en ">esta pestaña.
Si ejecuta este ejemplo, no es un hecho que verá uno allí. Es posible que otros visitantes ya hayan cambiado los valores en el almacén de sesiones del servidor. En este caso, no sé cuándo el servidor elimina el almacenamiento, por lo que si el contador supera 100, finalizaré la sesión.
De forma predeterminada, la sesión "vive" hasta que el visitante cierra la ventana del navegador. Esto se debe al hecho de que la función session_start() coloca dicha cookie en el cliente.
La duración de la sesión se puede cambiar usando la función session_set_cookie_params(), aquí está su sintaxis.
session_set_cookie_params (int duración [, ruta de cadena [, dominio de cadena [, bool seguro]]])
En la práctica, es suficiente usar solo el primer parámetro (vida útil), aquí se anota el tiempo en segundos, que determina cuánto tiempo debe recordar el servidor el estado de la sesión después de cerrar el navegador.
El efecto de la función session_set_cookie_params() se aplica solo al período en que se ejecuta el script.
A continuación se muestra un ejemplo del uso de esta función:
Valor del contador:=$_SESSION["count"]?>.
Abra el contador en ">esta pestaña.
Dale cuerda al contador y cierra el navegador, después de 30 segundos abre este ejemplo nuevamente. Tu sesión se guardará.
Las sesiones en PHP o como datos sobre un usuario o cliente que visita un sitio se guardan al moverse entre las páginas de un sitio sin mucha dificultad. La lección es muy importante. Relevante para la creación del 95% de los sitios web.
ejemplo de trabajo
1.
El usuario ingresa su nombre de usuario y contraseña e ingresa al sitio.
2.
Los datos con nombre de usuario y contraseña se guardan en una sesión de una de las páginas del sitio:
Archivo index.php
inicio_sesión(); // cada archivo en el que desee utilizar datos de sesión debe contener un comando "iniciar sesión" al principio del código
$iniciar sesión = "administrador";
$contraseña = "contraseña";
$_SESSION["iniciar sesión"] = $iniciar sesión; // guarda una variable que contiene el inicio de sesión
$_SESSION["contraseña"] = $contraseña; //guarda una variable que contiene la contraseña
3. Cuando vaya a otra página del sitio, estos datos también estarán disponibles:
Archivo ejemplo.php(o cualquier otra página)
Echo "Su inicio de sesión".$_SESSION["login"]; // mostrará "Su inicio de sesión es administrador", ¡aunque no registramos ningún dato en esta página!
¡Mira, es simple!
4. Si desea borrar los datos de la sesión, todo lo que necesita hacer es:
Archivo ejemplo.php
inicio_sesión(); // "iniciar la sesión" nuevamente
Desarmado($_SESSION["iniciar sesión"]); // así es como la variable fue dada de baja o “destruida”
echo "Su inicio de sesión".$_SESSION["iniciar sesión"]; // mostrará "Su inicio de sesión". Como lo destruimos en la última línea, no hay datos.
sesión_destroy(); // destruye la sesión. Todos los datos, incluido $_SESSION["contraseña"], ya no están ahí. Al solicitarlos se mostrará un error
En general, dicha transferencia es similar al método POST, pero ya no es necesario escribir mucho código innecesario y todos los datos transferidos de una página a otra se almacenan en archivos temporales en el servidor. Repito, las sesiones deben contener pequeñas cantidades de datos, por lo que son adecuadas para almacenar nombres de usuario/contraseñas, carritos de compras y otros volúmenes pequeños.
Volvemos a utilizar una determinada página de inicio. index.php
inicio_sesión();
$r = array("uno", "dos", "tres");
$_SESSION["arr"] = $r;
A la página donde se mostrará todo.
Guardamos los datos en la sesión y seguimos el enlace a otra página, donde mostraremos todos los datos.
Archivo de destino, página prueba.php donde abrimos la matriz
inicio_sesión();
print_r($_SESSION["arr"]);
// imprimirá
/*
Formación
=> uno
=> dos
=> tres
*/
?>
Quizás quieras repasar la lección de . En general, todo debería quedar claro.
Lista de funciones para trabajar con sesiones en php
session_cache_expire: devuelve la caducidad del caché actual
session_cache_limiter: obtiene y/o establece el limitador de caché actual
session_commit es un alias para session_write_close()
session_decode: decodifica los datos de la sesión desde una cadena
session_destroy: destruye todos los datos registrados para la sesión
session_encode: cifra los datos de la sesión actual como una cadena
session_get_cookie_params: obtiene los parámetros de las cookies de sesión
session_id: obtiene y/o establece la identificación de la sesión actual
session_is_registered: determina si la variable está registrada en la sesión
session_module_name - obtiene y/o establece el módulo de sesión actual
session_name: obtiene y/o establece el nombre de la sesión actual
session_regenerate_id: modifica la identificación de la sesión actual con una recién generada
session_register: registra una o más variables para la sesión actual
session_save_path - obtiene y/o establece la ruta para guardar la sesión actual
session_set_cookie_params: establece los parámetros de las cookies de sesión
session_set_save_handler: establece funciones de almacenamiento de sesiones a nivel de usuario
session_start - inicializa los datos de la sesión
session_unregister: cancela el registro de una variable de la sesión actual
session_unset: libera todas las variables de sesión
session_write_close - escribe los datos de la sesión y el final de la sesión
Contador de visitas a una página dentro de una sesión
// Un ejemplo sencillo de uso de sesiones sin Cookies.
nombre_sesion("prueba");
inicio_sesión();
$_SESSION["cuenta"] = @$_SESSION["cuenta"] + 1;
?>
¡Gracias por su atención! ¡Buena suerte en tus esfuerzos!