PHP 数据 session 存储

标签 php mysql session

在我的网站上,用户目前可以比较多个公司的预置。 对于每个公司,我计算了预站的价格。

为了计算这个价格,我有一个非常大的 SQL 请求,以便根据用户之前的输入过滤公司并获取我需要的每个参数。

查询结束后,我会遍历公司列表并计算每个公司以及公司提供的每项附加服务的价格。然后我以 HTML 形式向用户显示这些值。

然后,用户可以添加或删除选项并对公司进行订购。

然后,当用户选择价格时,我将 company_id 与用户的 otpion(他选择的不同服务)一起发送到服务器,并获取之前从用户 SESSION 计算的价格。

价格存储在用户 session 中,以避免计算过程,但是,对于一个用户请求,我有大约 6 个公司的价格,通常有大约 30 个公司的价格。这意味着我在 session 中存储一个数组,其中包含一个用户大约 180 种不同的价格。

我发现在 session 中存储这么多变量非常浪费,我想知道是否有更好的方法来存储这些变量?我应该将它们存储在数据库中吗?

顺便说一下,服务器端,我使用 PHP 和 Mysql 作为数据库。

最佳答案

您实际上所做的是一种非常原始的缓存形式。遗憾的是,由于多种原因, session 并不是这样做的最佳场所:

  • session 永远不能在用户之间共享。某些缓存的值对于每个用户来说可能都是相同的。拥有一个允许您随意走“唯一”或“共享”路线的缓存是件好事。
  • 您的 session 缓存数据是否在每个页面上使用?如果是的话,那就忘记这一点吧。但是,如果不是,则在每个页面上,您仍然会产生获取数据(根据您的服务器配置,可能涉及一些 fs 调用、网络调用或组合)和反序列化数据的成本,根据每个请求。如果您的 session 负载很大,这可能会导致加载时间显着不同。
  • 要考虑的另一点是一个简单的事实,如果您正在运行直接开箱即用的 LAMP 堆栈并且尚未配置共享 session 驱动程序,那么当您横向扩展:-)

在我们进一步讨论之前,先问自己以下问题:

  1. session 中的值是否会因用户而异?如果这样做的话,比例是固定的吗?
  2. session 中的值是否经常更改?
  3. 这些值是如何计算的?

如果 #1 为“否”

您最好缓存一个副本并为每个用户使用它。

如果#2 为“否”

您最好对数据库中的值进行非规范化(即预先计算)

如果#3是一个复杂的公式

参见#2

在任何情况下

MySQL 是一个非常差的缓存驱动程序,如果可以的话应该避免。大多数人将其替换为 redis,但这也不是一个很好的方法,因为它无法自行扩展(您需要 nutcracker/twemproxy 才能使其正确分片)。不管怎样,如果你要缓存的数据比较小,MySQL就可以了。不过,请为 future 做好计划。

如果您确实计划采用正确的缓存方式,请考虑使用键值存储(例如 Riak)或文档存储驱动程序(例如 Aerospike)。

关于PHP 数据 session 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28860469/

相关文章:

php - 在链接到数据库的 PHP 中计算测验分数

MySQL允许来自多个IP地址的远程连接

mysql - 连接 2 个表的准确结果

php - Codeception 的 ApiTester.php 在哪里?

javascript - 使用 JS 获取包裹在 PHP while 循环中的输入字段的值

javascript - 如何使用 HTML 中的数据属性用数据库中的链接填充链接和图像源?

php - 在 php mysql 中将 php 变量作为参数传递

php - Session不能长时间保留自动销毁

session - 如何在客户端完全禁用 SSL session 恢复?

c# - 必须声明标量变量 "@Email"