将数据库连接存储在会话变量中[重复]
Posted
技术标签:
【中文标题】将数据库连接存储在会话变量中[重复]【英文标题】:Storing database connection in a session variable [duplicate] 【发布时间】:2011-08-30 01:08:27 【问题描述】:我们中的许多人都编写了需要数据库的 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
【讨论】:
以上是关于将数据库连接存储在会话变量中[重复]的主要内容,如果未能解决你的问题,请参考以下文章
我可以从 JDBC 连接为 Postgres 设置会话变量吗