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


Storing database connection in a session variable

可能的重复项:
无法在 php 中的会话中传递 mysqli 连接

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

我注意到的是,很多时间都花在连接和运行一些相同的查询上。正因为如此,我有一个有趣的想法:将大部分是静态的连接和可能的结果集存储在$_SESSION变量中,以减轻用户导航站点时的负担。

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

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

不能在会话中存储数据库连接或结果集,因为这些是资源,并且:

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

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

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

即使你可以做到这一点(资源与数据),这也是一个坏主意。 你最终会得到大量的并发开放连接,这将很快破坏你的最大连接数......特别是如果其生命周期从 100 毫秒以下(取决于您的查询)扩展到 20 分钟或更长时间。 通过打开连接,像MySQL这样的东西也无法正确重置其内存分配,整个系统就会陷入地狱。 简而言之,这不是数据库的用途,除非代码的唯一使用者是单个用户。

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

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

你应该把它们放在一些配置文件中,以便更好地使用。会话适用于特定会话,而不是全局会话。