我不完全确定你在说什么,所以我会提到脑海中浮现的可能性。
也许这个。。。
// 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
\'的内部操作。还有其他一些缓存机制在发挥作用。