购物车持久性:$ _ SESSION还是浏览器cookie?

2021/01/31 06:41 · php ·  · 0评论

在没有用户名/登录名来保存购物车数据的电子商务网站上,使用PHP $ _SESSION变量或浏览器cookie来保存购物车中的商品会更好吗?我倾向于$ _SESSION,因为可以禁用cookie,但想听听您的想法。

预先感谢您的考虑。

都没有

大型站点都不敢在会话或cookie中存储用户的购物车-这些数据只是有价值的。

客户购买的商品,选择的商品,购买的商品数量,为什么未完成结帐等对您的业务非常重要。

使用数据库表存储此信息,然后将其链接到用户的会话。这样,您就不会丢失信息,您可以返回并根据用户购物车建立统计信息,或者解决结帐流程中的问题。

记录一切。

数据库架构

下面是一个简化的示例,说明了如何看待数据库级别。

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?)
}

您可能还希望将购物车表拆分为更多表,以便跟踪购物车的修订。

届会

普通的PHP会话包括两部分

  1. 数据(存储在服务器上的文件中)
  2. 赋予用户代理(浏览器)的唯一标识符

因此,它不是$_SESSIONvs-$_COOKIE它是$_SESSION + $_COOKIE =“ session”。但是,有几种方法可以通过使用包含数据的单个加密cookie来进行修改(因此,您不需要标识符即可查找数据)。另一种常见方法是将数据存储在内存缓存或数据库中,而不是文件系统中,以便多个服务器可以访问它。

@ Travesty3的意思是,您可以有两个cookie-一个用于会话,另一个可以是“保持登录状态” cookie(其存在时间长于会话cookie),也可以是单独cookie中的数据副本。 。

正如Xeoncross指出的那样,存储任何可能的信息进行分析非常重要。因此,不应完全依赖会话和cookie。

一种可能的方法是-

如果未登录,则使用会话

如果用户未登录,则可以$_SESSION在PHP中使用会话存储和检索购物车项目和愿望清单项目

登录时使用数据库

如果用户已登录,则可以考虑以下两个选项之一-

  • 仅将购物车商品或愿望清单商品存储在数据库中
  • 将购物车商品或愿望清单商品存储在数据库以及会话中(这将保存一些数据库查询)

用户登录时

用户登录后,从会话中获取所有购物车商品和愿望清单商品,并将其存储在数据库中。

即使用户注销或更改计算机,这也将使数据持久化,但是直到用户尚未登录,才无法永久存储信息,因此信息将不会持久化。

获取所需数据

每当您尝试访问购物车或愿望清单时,请进行以下检查-

  • 如果用户未登录,则进入会话
  • 如果用户已登录,请查询数据库(如果您仅存储在数据库中),否则,如果您要保持会话与数据库一起更新,则可以只查看会话。

我会将其存储在SESSION中。我的愿望清单很长,恐怕它不适合COOKIE可能占用的4K存储空间。它迫使您将会话超时设置为更长的时间。

注意:有些国家(例如我所在的荷兰)对Cookie的政策非常严格,法律可能会强迫您使用Session。

您可以考虑同时使用两者。

缺点$_SESSION是关闭浏览器后会清除会话。

使用会话,但是尝试从cookie中填充$ _SESSION数据(如果有)。

一些要点:

饼干:

  • 信息将一直保留到cookie过期(您可以配置什么)为止;
  • 倾向于减慢服务器和客户端之间的通信,因为必须在每个请求/响应之间在两者之间进行交换;
  • 这是一种不安全的数据存储方式,易于嗅探;
  • 他们也有存储数据的限制。

会议:

  • 所有信息都保留在服务器中,因此无法与客户端交换。
  • 因为它不是跨网络共享的,所以它更加安全。
  • 会话结束时,所有信息都会丢失;
  • 如果您托管在共享主机中,则由于在同一服务器上托管的任何站点对资源的推送,会话可能会在操作过程中结束时遇到问题。

I would personally go with sessions, since I'm assuming to be a small/meddium auddience page. If it grows, you would be better with a simple DB structure to store this data, with a maintenance plan to get ridge of unnecessary data (eg: clients that choose some products but don't do the checkout).

我会使用一个会话。如果用户禁用了Cookie,则会话将无法启动,因为会话ID以Cookie的形式存储在用户的计算机上。

您可能需要查看一些设置,以尝试使会话保持更长的时间。

  • 通过session_set_cookie_params()使用lifetime参数集运行防止用户关闭浏览器时删除会话cookie 该功能需要先运行session_start()

  • 您可能还想通过修改session.gc_probability, session.gc_divisor, session.gc_maxlifetimephp.ini中的会话垃圾收集设置或使用以下命令来扩展从服务器清除会话的频率:ini_set()

  • 如果服务器上有其他网站正在运行,并且您修改了上面的垃圾收集设置,则需要在php.ini中进行设置,以便将它们应用于所有网站,或者如果您正在使用,ini_set()则还可以考虑将这些会话保存到其他网站通过修改比其他网站目录session_save_path()再次在此之前运行session_start()这将防止其他网站的垃圾收集清除您针对某个特定站点的扩展会话。

  • 我还建议在php.ini中设置以下会话设置session.entropy_file = /dev/urandom, session.entropy_length = 256, session.hash_function = sha512这应该为您提供加密强度高的会话ID,并且发生冲突的可能性极小。

  • 并确保您的站点上具有SSL证书,以防止中间人攻击您的会话ID。

显然,用户仍然可以决定手动清除其所有cookie,这些cookie将带有会话ID cookie,但这是我准备承担的风险。如果我在购物车系统中途还没有结帐,就不会去清除我的cookie。我仍然认为会话比仅使用纯Cookie更好。

只要您是唯一有权访问会话目录且会话ID强大的网站,数据就足够安全。通过延长服务器的会话存储时间,您的数据可以保留在服务器上。

您可以采取其他措施来增强会话强度。每隔20分钟重新生成一次会话ID,将数据复制过来。还要根据数据库中的IP地址记录会话ID,并检查特定IP地址是否在给定时间内尝试发送多于X个会话ID,以防止有人试图强行使用会话ID。

您也可以将数据存储在通过会话ID链接的数据库中,而不是存储在服务器上的会话文件中。但是,这仍然依赖于存储在cookie中的会话ID,并且可能随时消失。真正确保用户不会丢失购物车的唯一方法是让他们先登录并存储在数据库中。

本文地址:http://php.askforanswer.com/gouwuchechijiuxing-_-sessionhuanshiliulanqicookie.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!