una session_start expiration ejemplos crear cookie con php cookies session-variables

expiration - php session_start cookie



Persistencia del carro de compra: $_SESSION o cookie del navegador? (6)

Ninguno

Ningún sitio grande se atrevería a almacenar el carro de un usuario en una sesión o cookie, esa información es muy valiosa.

Lo que los clientes están comprando, cuando seleccionan artículos, cuántos compran, por qué no terminan el pago, etc. son muy, muy importantes para su negocio.

Use una tabla de base de datos para almacenar esta información y luego vincúlela a la sesión del usuario. De esta forma, no perderá la información y podrá volver atrás y crear estadísticas basadas en carros de usuarios o resolver problemas con su proceso de pago.

Registre todo lo que pueda.

Esquema de base de datos

A continuación se muestra un ejemplo simplificado de cómo esto podría verse en el nivel de la base de datos.

user { id email } product { id name price } cart { id product_id user_id quantity timestamp (when was it created?) expired (is this cart still active?) }

Es posible que también desee dividir la tabla de carrito en más tablas para poder realizar un seguimiento de las revisiones en el carrito.

Sesiones

Las sesiones PHP normales constan de dos partes

  1. Los datos (almacenados en un archivo en el servidor)
  2. Un identificador único dado al agente de usuario (navegador)

Por lo tanto, no es $_SESSION vs $_COOKIE - es $_SESSION + $_COOKIE = "session". Sin embargo, hay formas en que puede modificar esto usando una única cookie encriptada que contiene los datos (y, por lo tanto, no necesita un identificador para encontrar los datos). Otro enfoque común es almacenar los datos en memcached o una base de datos en lugar del sistema de archivos para que varios servidores puedan acceder a él.

Lo que @Travesty3 está diciendo es que puede tener dos cookies, una para la sesión y otra que es una cookie "mantenerme conectado" (que existe más tiempo que la cookie de sesión), o una copia de los datos dentro de una cookie separada .

En un sitio de comercio electrónico sin nombre de usuario / inicio de sesión para conservar los datos del carrito, ¿sería mejor usar la variable PHP $ _SESSION o una cookie del navegador para conservar los artículos en el carrito de compras? Me estoy inclinando por $ _SESSION ya que las cookies se pueden desactivar, pero me gustaría escuchar sus opiniones.

Gracias de antemano por su consideración.


Algunos puntos para ayudar:

Galletas:

  • la información se conserva hasta que la cookie caduque (lo que usted puede configurar);
  • tienden a ralentizar la comunicación entre el servidor y el cliente, ya que debe intercambiarse entre los dos en cada solicitud / respuesta;
  • es una forma insegura de almacenar datos y es fácil de oler;
  • también tienen un límite para almacenar datos.

Sesión:

  • toda la información se conserva en el servidor, por lo que no se ha intercambiado con el cliente.
  • porque no se comparte a través de la red, es un poco más seguro;
  • toda la información se pierde cuando la sesión termina;
  • Si aloja en un host compartido, puede tener problemas con la finalización de la sesión en el medio de una operación debido a un empuje de los recursos por cualquiera de los sitios alojados en el mismo servidor.

Yo personalmente iría con las sesiones, ya que supongo que será una página de auddiencia pequeña / médium. Si crece, sería mejor con una estructura de base de datos simple para almacenar estos datos, con un plan de mantenimiento para obtener datos innecesarios (por ejemplo, clientes que eligen algunos productos pero no realizan el pago).


Como lo señaló Xeoncross, es muy importante almacenar cualquier información posible para el análisis. Entonces, uno no debería depender completamente de las sesiones y las cookies.

Un posible enfoque es-

Use sesiones si no está conectado

Si el usuario no ha iniciado sesión, puede almacenar y recuperar los artículos del carrito y los artículos de la lista de deseos de la sesión usando $_SESSION en PHP

Usa la base de datos cuando estás conectado

Si el usuario está conectado, puede considerar una de las dos opciones:

  • Guarde el elemento del carrito o artículo de la lista de deseos solo en la base de datos
  • Almacene el elemento del carrito o artículo de la lista de deseos en la base de datos y en la sesión (esto guardará algunas de sus consultas a la base de datos)

Cuando el usuario inicia sesión

Cuando el usuario inicia sesión, obtenga todos los elementos del carrito y artículos de la lista de deseos de la sesión y guárdelos en la base de datos.

Esto hará que los datos sean persistentes incluso si el usuario cierra la sesión o cambia la máquina, pero hasta que el usuario no haya iniciado sesión, no hay forma de almacenar la información permanentemente, por lo que no será persistente.

Obtener los datos requeridos

Siempre que intente acceder al carrito o lista de deseos haga la siguiente verificación:

  • Si el usuario no está conectado, mira la sesión
  • Si el usuario está conectado, consulte la base de datos si está almacenando solo en la base de datos; de lo contrario, puede consultar las sesiones si mantiene la sesión actualizada junto con la base de datos.

Lo almacenaría en una SESIÓN. Mi lista de deseos es bastante larga, y me temo que no encajará en el almacenamiento de 4K que una GALLETA puede ocupar. Te obliga a establecer el tiempo de espera de la sesión en un período más largo.

Nota: hay algunos países (como los Países Bajos, donde yo) que tienen políticas muy estrictas sobre las cookies, y es posible que la legislación obligue a utilizar Sesiones.


Puede considerar usar ambos.

El inconveniente con $_SESSION es que la sesión se borra cuando el navegador está cerrado.

Use sesiones, pero intente completar los datos $ _SESSION de una cookie, si está disponible.


Yo usaría una sesión. Si un usuario tiene las cookies deshabilitadas, entonces la sesión no podrá iniciarse ya que la ID de la sesión se almacena en la máquina del usuario en una cookie.

Hay algunos ajustes que puede consultar para tratar de mantener las sesiones por más tiempo.

  • Evite que la cookie de sesión se elimine cuando el usuario cierre su navegador ejecutando session_set_cookie_params() con el conjunto de parámetros de por lifetime . Esta función debe ejecutarse antes de session_start()

  • También es posible que desee ampliar la frecuencia con la que las sesiones se borran del servidor modificando la configuración de recolección de basura de la sesión ini_set() en php.ini o usando ini_set()

  • Si tiene otros sitios web ejecutándose en el servidor y modifica la configuración anterior de recolección de elementos no utilizados, los necesitará en php.ini para que se apliquen a todos los sitios web, o si está usando ini_set() entonces también puede ver cómo guardar estas sesiones. a un directorio diferente al de otros sitios web modificando session_save_path() . De nuevo, esto se ejecuta antes de session_start() . Esto evitará que la recolección de basura de otros sitios web limpie sus sesiones extendidas para un sitio en particular.

  • También recomendaría establecer la siguiente configuración de sesión en php.ini session.entropy_file = /dev/urandom, session.entropy_length = 256, session.hash_function = sha512 . Eso debería darle una identificación de sesión criptográficamente fuerte con una posibilidad extremadamente pequeña de colisiones.

  • Y asegúrese de tener un certificado SSL en su sitio para evitar que el hombre en el medio ataque contra su ID de sesión.

Obviamente, un usuario podría decidir borrar manualmente todas sus cookies que llevarán consigo la cookie de ID de sesión, pero ese es un riesgo que estaría dispuesto a tomar. Si estaba a la mitad de un sistema de carrito de la compra y no me había retirado, no iría a limpiar mis cookies. Sigo pensando que las sesiones son mejores que el simple uso de cookies simples.

Los datos son lo suficientemente seguros siempre que sea el único sitio web que tenga acceso al directorio de sesiones y su ID de sesión sea sólida. Y al extender el tiempo de almacenamiento de la sesión del servidor, sus datos pueden persistir en el servidor.

Hay otras medidas que podría emplear para hacer sus sesiones aún más fuertes. Vuelva a generar su ID de sesión cada 20 minutos, copiando los datos. También registre ID de sesión contra direcciones IP en una base de datos y verifique si una determinada dirección IP intenta enviar más de X ID de sesión en un momento determinado para evitar que alguien intente forzar en bruto una ID de sesión.

También puede almacenar los datos en una base de datos vinculada por la ID de sesión, en lugar de en un archivo de sesión en el servidor. Sin embargo, esto todavía depende de una ID de sesión que se almacena en una cookie y podría desaparecer en cualquier momento. La única forma de estar verdaderamente seguro de que un usuario no pierde su carrito es haciendo que inicie sesión primero y lo guarde en una base de datos.