【问题标题】:PHP PDO CachingPHP PDO 缓存
【发布时间】:2009-12-10 22:37:09
【问题描述】:

我一直在寻找这个问题的答案,但在任何地方都没有找到。是否缓存了对 PDO::prepare() 的调用,或者我应该自己缓存结果,即如果我执行以下操作

function foo () {
  $handle = PDO::prepare(...);
  /* do stuff with the handle */
}

prepare() 语句是否会被 PDO 缓存,以便在第二次、第三次等时快速检索到它?还是自己做比较好,例如

function foo() {
  static $handle = null;
  if (!$handle) {
    $handle = PDO::prepare(...);
  }
  /* do stuff with the handle */
}

【问题讨论】:

    标签: php caching pdo


    【解决方案1】:

    MySQL query cache。但总的来说,您绝对应该保留准备好的语句的标识符并重新使用它。

    查询缓存在 MySQL 8.0 版本中消失了,请参阅

    https://dba.stackexchange.com/questions/217577/why-mysql-remove-query-cache-in-8-0-version

    https://mysqlserverteam.com/mysql-8-0-retiring-support-for-the-query-cache/

    【讨论】:

    • 这就是为什么你不链接到 SO 上的外部资源,你的链接不再起作用了。
    • 产品文档的链接使用了八年——在我看来还不错。现在产品发生了变化,我的回答很可能已经过时了。
    【解决方案2】:

    PDO::prepare() 的两次后续调用(即使使用相同的 SQL 查询)应返回两个不同的PDOStatement(或句柄)以避免冲突,尤其是在您可能应用到它的先前绑定和当前绑定之间。无论如何,使用prepare() 创建 PDOStatement 的成本很低。您可能想要缓存的是从同一 SQL 查询返回的结果,无论是原始的还是由 prepare() 构建的,这是您的 DBMS(例如 MySQL)的一个特性,而不是 PHP。

    【讨论】:

      【解决方案3】:

      这取决于您的数据库驱动程序。使用 MySQL,PDO 将默认创建一个本机准备好的语句。如果您想使用实际的查询缓存,可以禁用它。

      如果您绝对必须重复执行相同的查询,那么是的,您需要保留该句柄。如果您使用的是模拟的准备好的语句,那么它根本没有区别。

      【讨论】:

        【解决方案4】:

        前段时间我试过CPDO,它可以用作标准PDO

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-09
          • 1970-01-01
          • 2010-09-27
          • 2014-03-12
          • 2015-08-13
          • 2010-12-13
          • 2013-10-24
          • 2012-01-02
          相关资源
          最近更新 更多