将数据库连接存储在会话变量中[重复]

Posted

技术标签:

【中文标题】将数据库连接存储在会话变量中[重复]【英文标题】:Storing database connection in a session variable [duplicate] 【发布时间】:2011-08-30 01:08:27 【问题描述】:

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

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

我注意到,很多时间都花在了连接和运行一些相同的查询上。因此,我产生了一个有趣的想法:将连接和可能的结果集(大部分是静态的)存储在 $_SESSION 变量中,以减少用户浏览网站时的负担。

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

我的问题归结为:这真的有可能吗?如果是这样,我应该注意什么(除了session fixation,因为它本身的问题适用于所有会话)?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

你应该在一些配置文件中更好地使用。会话是针对特定会话的,而不是针对全局的。

【讨论】:

【参考方案3】:

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

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

【讨论】:

我没有想到连接问题。这就是我问的原因:) 看看 Memcached。我什至在没有数据库的网站上使用它......让我构建一个复杂的 PHP 页面,并整天提供它(无需重新渲染),因为它会被 SVN 签入失效。【参考方案4】:

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

【讨论】:

以上是关于将数据库连接存储在会话变量中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 会话与 Cookies [重复]

gsoap - 定义一个对所有会话持久的变量

我可以从 JDBC 连接为 Postgres 设置会话变量吗

支持索引视图的会话设置

如何使用棘轮 websockets 将数据发送到服务器 onload?

如何在python多进程代码中使用cx_Oracle创建一个连接(或会话)池来连接Oracle数据库?