是否有人将数据库数据存储在PHP $ _SESSION中?

时间:2012-02-10 15:44:31

标签: php mysql session caching memcached

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

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

  • 当用户想要导出

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

$ _SESSION中的这个存储即使在用户不打算导出时也会发生。这让我觉得非常低效,因为$ _SESSION变量可能会爆炸,因为每个数据库表都有每个表的检索数最多可达30MB,$ _SESSION的过期时间设置为24小时。因此,系统中最多可能有5个用户,最多有150MB $ _SESSION变量。 关于正确的声音?

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

正如您在此处所解释的,我认为您将在局域网中使用此功能,并且您没有超过5个并发用户。如果我说得对,为什么不直接从数据库中读取数据库并在HTML上显示它(我想你可以使用分页而不想在一个HTML页面中显示所有30MB数据)再次导出全部当用户请求数据时直接从数据库到Excel:)