在会话变量中存储数据库连接

时间:2011-05-21 00:35:59

标签: php database session-variables

  

可能重复:
  Can't pass mysqli connection in session in php

我们中的许多人编写了需要数据库的PHP应用程序;主要是MySQL,但我经常使用非常小的MS Access数据库,因为技术能力较差的人可以下载调整它们/保存备份/等等。他们自己(这是否正确,我不知道)。

我注意到,连接和运行一些相同的查询需要花费大量时间。因此,我有一个有趣的想法:在$_SESSION变量中存储大多数静态的连接和可能的结果集,以减轻用户导航网站时的负担。

显然这样做需要很多考虑。在会话被销毁时关闭连接的事情只是一个开始。

我的问题归结为:这真的有可能吗?如果是这样,我应该注意哪些事情(除session fixation之外,因为它是适用于所有会话的自身问题)?

4 个答案:

答案 0 :(得分:12)

您无法在会话中存储数据库连接或结果集,因为它们是资源,并且:

  

某些类型的数据无法序列化,因此存储在会话中。它包括资源变量或具有循环引用的对象(即将对自身的引用传递给另一个对象的对象)。

     

http://php.net/manual/en/intro.session.php

您可以将结果集提取到普通数组中,并将其存储在会话中,就像任何其他变量一样。无论如何,那将是一个相当典型的会话用例。请注意不要在会话中存储太多数据,因为这可能比从数据库中获取数据更加沉重。

答案 1 :(得分:10)

即使您可以这样做(资源与数据),这也是一个坏主意。你将结束大量的并发打开连接,这将很快打破你的最大连接...特别是如果它的生命周期超过100毫秒(取决于你的查询)超过20分钟或更长。使用开放连接,像MySQL这样的东西也无法正确地重置其内存分配,整个系统都会变得很糟糕。简而言之,这不是DB的用途,除非您的代码的唯一消费者是单个用户。

作为替代方案,我强烈建议使用专门用于减少数据库负载和避免连接时间的缓存技术。使用类似的,最简单的,memcached将大大提高性能,并且您将能够确切地指定有多少系统资源进入缓存 - 同时让数据库在需要时完成数据获取工作到。

答案 2 :(得分:1)

您可以检查连接部件的永久连接。 http://php.net/manual/en/function.mysql-pconnect.php

答案 3 :(得分:1)

你应该在一些配置文件中更好地使用它们。会议针对特定会议而非全球会议。