有人在PHP$\u会话中存储DB数据吗?

有人在PHP$\u会话中存储DB数据吗?,php,mysql,session,caching,memcached,Php,Mysql,Session,Caching,Memcached,我刚参加了一个项目,一直在研究代码。我们需要为内部用户将大量数据导出到Excel。在给定的时间内,大约有5个人可以访问此功能。为了输出到Excel,我发现: 从数据库检索数据,存储在$\u会话中 显示数据的HTML页面视图 当用户想要导出时 从$\u会话检索数据库数据 在CSV的内存中创建字符串 以Excel作为文件类型打印HTTP标题 打印出CSV格式的字符串 即使用户不打算导出,$\u会话中的此存储也会发生。这让我觉得效率极低,因为$\u会话变量的大小可能会爆炸,因为每个DB表的检索

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

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

  • 当用户想要导出时

    • 从$\u会话检索数据库数据
    • 在CSV的内存中创建字符串
    • 以Excel作为文件类型打印HTTP标题
    • 打印出CSV格式的字符串
即使用户不打算导出,$\u会话中的此存储也会发生。这让我觉得效率极低,因为$\u会话变量的大小可能会爆炸,因为每个DB表的检索次数最多可达30MB,并且$\u会话的过期时间设置为24小时。因此,系统中可能有多达5个用户,会话变量最多为150MB$\u听起来对吗?


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

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

但是,对于无法为每次页面加载动态提取的较大数据集,我通常更喜欢将它们存储在内存/堆表(或临时文件)中,并在会话中存储一个ID,以便能够轻松提取它们

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

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


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

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


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

是的,这就是正在发生的事情;在屏幕上显示,并存储在内存中以便导出。同意。该平台基于Zend框架,我很喜欢它。祝我在解决这个问题上好运…好的方面!最终,这不是我的代码,这是我在新项目中发现的一些WTF代码。我可以理解为什么他们决定缓存,因为其中一些查询非常复杂,需要很长时间运行(最多几分钟)。我想我会把它重构成MySQL中的内存表。