缓存无论如何都执行数据库查询

时间:2013-12-13 01:51:30

标签: php caching yii

尝试缓存查询:

$cache = new CDbCacheDependency( "SELECT * FROM team WHERE team_url = '$url' LIMIT 1" );
$teamModel = Team::model()->cache( 100000, $cache )->findByAttributes( array( "team_url" => $url ) );

在日志中我看到:

system.db.CDbCommand
Querying SQL: SELECT * FROM team WHERE team_url = 'someteamname'
LIMIT 1
---
system.caching.CFileCache
Serving "yii:dbquerymysql:host=localhost;dbname=xxx:xxx_user:SELECT
* FROM `team` `t` WHERE `t`.`team_url`=:yp0 LIMIT
1:a:1:{s:4:":yp0";s:14:"someteamname";}" from cache
in

如果查询被缓存,为什么每次都要执行?

编辑:

我已确认查询正在访问数据库。

3 个答案:

答案 0 :(得分:1)

该行将始终显示,因为它无条件地写入跟踪。请参阅CDbCommand:484

答案 1 :(得分:0)

因为它显示查询,即使它从缓存中提取查询。这就是它的工作方式。

答案 2 :(得分:0)

您可以通过检查mysql查询日志来确认查询是否真正执行。

在mysql控制台中

mysql>   SET GLOBAL general_log = 'ON';

mysql> show variables like '%general%';

你会得到这样的输出

+------------------+-----------------------------------------------------------+
| Variable_name    | Value                                                       
+------------------+-----------------------------------------------------------+
| general_log      | ON                                                           
| general_log_file | /Applications/XAMPP/xamppfiles/var/mysql/Mac-mini.log 
+------------------+-----------------------------------------------------------+

选择终端标签并输入此命令

tail -f general_log_file name 

(如:/Applications/XAMPP/xamppfiles/var/mysql/Mac-mini.log)

然后刷新应用程序中的页面。现在您可以看到在mysql中真正执行的查询是什么。