【问题标题】:Is anyone storing DB data in a PHP $_SESSION?有人将数据库数据存储在 PHP $_SESSION 中吗?
【发布时间】:2012-03-03 01:54:02
【问题描述】:

我刚刚加入了一个项目,并且一直在检查代码。我们需要为内部用户将大量数据导出到 Excel。大约有 5 个人可以在给定时间访问此功能。为了输出到 Excel,这是我发现的:

  • 从数据库中检索数据,存储在 $_SESSION 中
  • 显示数据的 HTML 页面视图

  • 当用户想要导出时

    • 从 $_SESSION 检索数据库数据
    • 在 CSV 的内存中创建字符串
    • 以 Excel 作为文件类型打印 HTTP 标头
    • 打印出 CSV 格式的字符串

即使用户不打算导出,$_SESSION 中的这种存储也会发生。这让我觉得效率非常低,因为 $_SESSION 变量的大小可能会爆炸,因为每个数据库表每个表最多可以检索 30MB,并且 $_SESSION 的到期时间设置为 24 小时。因此,系统中可能有多达 5 个用户,具有多达 150MB 的 $_SESSION 变量。 听起来对吗?

有没有人见过这样的东西?这像盗版 Memcache 吗?将数据写入每隔几个小时更新一次的平面文件不是最好吗?

【问题讨论】:

    标签: php mysql session caching memcached


    【解决方案1】:

    我确实在会话中存储数据库一些数据,例如我在每个页面上使用的 ID 或小对象。

    但是当涉及到我无法为每个页面加载即时提取的较大数据集时,我通常更喜欢将它们存储在 MEMORY/HEAP 表(或临时文件)中,并且只将 ID 存储在会话,以便我能够轻松提取它们。

    您可能想看看这个关于会话最大大小的问题: Maximum size of a PHP session

    【讨论】:

      【解决方案2】:

      我也看到了这个,这是个坏主意。有时您希望在屏幕上显示数据表,但也希望将其导出,但没有充分的理由将其塞入会话内存中。如果操作系统需要交换并且会话被写入文件,那么您就会遇到文件 IO 速度问题,因此在某些情况下,它可能比对数据库的新查询要慢。

      【讨论】:

      • 是的,这正是正在发生的事情;显示在屏幕上,并存储在内存中以供导出。
      【解决方案3】:

      您的示例中的$_SESSION 用于存储不需要的数据,以确保跨页面视图的一致性,因此这是没有意义的。它用于存储 last_page_viewed 之类的内容,而不是复制数据库本身。这样做的唯一原因是,如果获取数据的数据库调用非常昂贵,即使您描述的存储效率低下,它也会提高性能。这不太可能,听起来像是懒惰的编码。

      如果他们想导出,应该有一个 zip 函数,它使用相同的 SQL 读取所有数据,并按需将其打包成 excel 文件。理想情况下使用 MVC,以便可以将相同的代码输入 HTML 或 zipper 函数;)

      【讨论】:

      • 同意。该平台基于我喜欢的 Zend Framework。祝我好运尝试解决这个问题...
      【解决方案4】:

      如果您的数据库不经常更新,您的解决方案可能会起作用,否则您的用户可能会获得过时的数据。 (而且我认为无论如何存储在会话数据中是不值得的。)

      正如您在此处所解释的,我认为您将在 LAN 中使用它,并且您的并发用户不超过 5 个。如果我是对的,为什么不直接从数据库中读取数据库并在 HTML 上显示(我猜你可以使用分页,不想在单个 HTML 页面中显示所有 30MB 数据)再次导出所有当用户请求时,数据直接从数据库中写入 Excel :)

      【讨论】:

      • 好点!最终,这不是我的代码,这是我在新项目中找到的一些 WTF 代码。我可以理解他们为什么决定缓存,因为其中一些查询非常复杂并且需要很长时间才能运行(几分钟以上)。我想我会将其重构为 MySQL 中的 MEMORY 表。
      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 2013-08-14
      • 1970-01-01
      相关资源
      最近更新 更多