gpt4 book ai didi

php - 关于 CActiveDataProvider 与缓存数据库查询的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 23:48:46 25 4
gpt4 key购买 nike

我知道当 paginationfalse 时,CActiveDataProvider 从单个查询中使用。所以我写了这段代码:

$dependency = new CDbCacheDependency('SELECT MAX(id) FROM user');
$dataProvider = new CActiveDataProvider(User::model()->cache(20, $dependency), array('pagination'=>false));

当数据被缓存时,这个单一的查询被执行:

SELECT MAX(id) FROM user

20 秒后,缓存被刷新,所以有这个查询:

SELECT * FROM `user` `t`
SELECT MAX(id) FROM user

此外,如果我在 User 表中插入一条记录,因为它是依赖项,所以执行的查询是:

SELECT * FROM `user` `t`
SELECT MAX(id) FROM user

这里一切似乎都很好,没问题。

现在我用这个示例查询尝试另一个测试:

$dependency = new CDbCacheDependency('SELECT MAX(id) FROM user');
$dataProvider = new CActiveDataProvider(User::model()->cache(20, $dependency, 2));

我知道在上面的代码中 CActiveDataProvider 使用了两个查询。

缓存数据后,执行这些查询:

SELECT MAX(id) FROM user
SELECT MAX(id) FROM user

奇怪! (为什么?!)

20 秒后,缓存被刷新,我看到执行了这些查询:

SELECT COUNT(*) FROM `user` `t`
SELECT MAX(id) FROM user
SELECT * FROM `user` `t` LIMIT 10
SELECT MAX(id) FROM user

现在,我在这里有 4 个问题!!!

最后我在表中插入一条记录,因为依赖关系必须刷新缓存,但我在这里看到 6 个查询(而不是 4 个查询)!!!

SELECT MAX(id) FROM user
SELECT COUNT(*) FROM `user` `t`
SELECT MAX(id) FROM user
SELECT MAX(id) FROM user
SELECT * FROM `user` `t` LIMIT 10
SELECT MAX(id) FROM user

这种行为很奇怪! (为什么?!)

我认为这是一个错误。

谢谢

最佳答案

你好,我有这个问题并且非常搜索。我知道 $duration 或 $dependency 中的哪一个会过期,缓存也会过期。我的代码示例:

$dependency->sql = 'SELECT MAX(create_date),MAX(update_date),count(id) FROM game where status=:NOT_DONE';
$dependency->params = array(':NOT_DONE'=>Game::NOT_DONE);
$games = new CActiveDataProvider(Game::model()->cache(3600*24*30,$dependency,1));

I know when pagination is false, CActiveDataProvider use from single query.

这句话对我有帮助,谢谢。我正在寻找这个。

http://www.yiiframework.com/doc/api/1.1/CDbConnection#queryCachingDuration-detail

关于php - 关于 CActiveDataProvider 与缓存数据库查询的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22421974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com