【问题标题】: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,因为它本身的问题适用于所有会话)?

【问题讨论】:

    标签: php database session-variables


    【解决方案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

        【讨论】:

          猜你喜欢
          • 2015-05-06
          • 2015-10-09
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-17
          • 1970-01-01
          相关资源
          最近更新 更多