正确执行不可缓存的数据库查询

时间:2013-06-23 作者:Yoga

考虑代码

function getNow() {
    global $wpdb;

    $now = $wpdb->get_var("SELECT NOW()");

    $wpdb->flush();

    return $now;
}
我使用上述方法来避免get_var 方法when I run the function, I always get the same result, e.g.

echo getNow();
sleep(10);
echo getNow(); // Same result as above
问题:

有没有更好的方法来编写上述函数以避免缓存效应$wpdb 是否只缓存最后一个结果,而不是在同一请求中缓存所有查询的结果?就最后一个查询而言,听起来有点过头了,对吧

1 个回复
SO网友:s_ha_dum

我不完全确定你在说什么,所以我会提到脑海中浮现的可能性。

也许这个。。。

// Keep track of the last query for debug..
$this->last_query = $query;

http://core.trac.wordpress.org/browser/tags/3.5.2/wp-includes/wp-db.php#L1195

... 这就是你所说的。如果是这样,您的代码只运行flush method 重置$wpdb 属性到null 或空值。它不会“阻止”任何事情,也不像是“缓存”。它只是为PHP添加了更多的工作。

或者你在谈论这个:

$this->result = @mysql_query( $query, $this->dbh );

http://core.trac.wordpress.org/browser/tags/3.5.2/wp-includes/wp-db.php#L1200

但我不知道这如何算作“缓存”。该类必须检索结果并将其放置在某个地方。某个地方$this->results;

或者你在谈论这个:

这个get_var 函数从数据库返回单个变量。虽然只返回一个变量,但查询的整个结果都会被缓存以供以后使用。退货NULL 如果未找到结果。

http://codex.wordpress.org/Class_Reference/wpdb#SELECT_a_Variable

如果你试过$wpdb->get_var("SELECT ID FROM {$wpdb->posts}"); 您将得到一个与数据库中的行相等的结果集,但是get_var 将只返回一个结果。其他结果仍保留在对象中。如果您稍后碰巧需要这些结果,则无需再进行查询即可获得这些结果。

var_dump($wpdb->get_var("SELECT ID FROM {$wpdb->posts}"));
var_dump($wpdb->last_result);
这是我唯一真正认为是“缓存”的东西,尽管我从来都不需要它。这与您的查询没有实际区别,因为该查询无论如何只返回一行。

有没有更好的方法来编写上述函数?

忽略$wpdb->flush() 因为我真的没有看到这些好处,对于上面提到的任何一种情况,尤其是像这样的查询"SELECT NOW()". 下一个查询运行时$wpdb->flush 无论如何都将运行。

没有理由设置$now 变量,然后return 信息技术除非您打算在$now 之前的数据return正在加载,ustreturn 直接从查询中删除。

为什么$wpdb只缓存最后一个结果,而不是在同一个请求中缓存所有查询的结果?就最后一个查询而言,听起来有点过头了,对吧?

尽管《食品法典》使用了“缓存”一词,但我不确定这其中的大部分是否算作“缓存”,但我不会争辩这一点。如果它是一个缓存,那么它是一个非常小的缓存。“缓存”主要是如何$wpdb 作品

至于“缓存”请求中的每个查询,如果您尝试这样做,我预计会出现内存问题——至少在某些服务器上是这样。设想4或5个非常大的结果集都占用内存。

$wpdb 实际上只是一个相对简单的数据库接口。这很方便,但我希望你可能会像对待它一样对待它,或者期望它比实际情况更多。它运行一个查询,保存一点信息供自己使用和调试,以及当另一个查询运行时,除了基本连接信息和一些其他基本信息,如表名快捷方式($wpdb->posts), 它被擦干净,然后重新开始。它不是全局查询管理器或查询缓存。

根据更新的描述,我运行了:

function getNow() {
    global $wpdb;
    $now = $wpdb->get_var("SELECT NOW()");
    $wpdb->flush();
    return $now;
}

echo \'<pre>\';
echo getNow();
echo "\\n";
sleep(10);
echo getNow(); // Same result as above
echo \'</pre>\';
die;
并获得:

2013-06-25 10:37:06
2013-06-25 10:37:16

每次我跑步,两个结果相差10秒。

然后我用$wpdb->flush(); 已注释掉。相同的结果。这很有道理,因为$wpdb->flush(); 仍在每个查询之前运行as you can see from the source.

您看到的效果不是$wpdb\'的内部操作。还有其他一些缓存机制在发挥作用。

结束