文章目录
最近帮自己个主题加功能果阵发现启用DB Cache Reloaded Fix之后果个功能就出问题了。
研究咗下DB的代码,发现佢缓存没搜索到果阵的数据。例如:你SELECT一条数据,冇就INSERT,有就UPDATE。
1 2 3 4 5 6 7 8 9 |
$sid = intval( $wpdb->get_var( "SELECT ID FROM `$table_name` WHERE `s_key`='$keyword' " ) ); if (0>= $sid) { $wpdb->query( "INSERT INTO $table_name (itime, s_key, s_date) VALUES ('1', '$keyword', now() )" ); } else { $wpdb->query( "UPDATE $table_name SET `itime`= `itime`+'1', `s_date`= now() WHERE `ID`='$sid' " ); } |
当查询一个新值果阵(原来不存在的),上边的代码系冇启用DB Cache Reloaded Fix是正常的,启用之后就是一味咁SELECT唔到,因为缓存就是返回0,变成永远都是INSERT。
目前念咗两个方法
方法1,用新的数据接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//判断是否需要定义新的数据入口 $bUseDBc = false; $new_wpdb = null; if ( class_exists( 'DBCacheReloaded' ) ) { global $wp_db_cache_reloaded; if ( isset( $wp_db_cache_reloaded->config['enabled'] ) && $wp_db_cache_reloaded->config['enabled'] ) { $new_wpdb = new wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); $bUseDBc = true; } } $sid = 0; if ( $bUseDBc ) { $sid = intval( $new_wpdb->get_var( "SELECT ID FROM `$table_name` WHERE `s_key`='$keyword' " ) ); } else { $sid = intval( $wpdb->get_var( "SELECT ID FROM `$table_name` WHERE `s_key`='$keyword' " ) ); } // end if (0>= $sid) { $wpdb->query( "INSERT INTO $table_name (itime, s_key, s_date) VALUES ('1', '$keyword', now() )" ); } else { $wpdb->query( "UPDATE $table_name SET `itime`= `itime`+'1', `s_date`= now() WHERE `ID`='$sid' " ); } |
上边判断有冇插件,同埋是唔系启用紧,是就用新的接口来查询。
旧的$wpdb以经被DB Cache Reloaded的$dbcr_wpdb替换咗,你点搞都是揾唔到,导致后边永远都是插入数据,依家$new_wpdb就冇问题了。
方法2,清缓存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$sid = intval( $wpdb->get_var( "SELECT ID FROM `$table_name` WHERE `s_key`='$keyword' " ) ); if (0>= $sid) { //清除缓存 begin if ( class_exists( 'DBCacheReloaded' ) ) { global $wp_db_cache_reloaded; if ( isset( $wp_db_cache_reloaded->config['enabled'] ) && $wp_db_cache_reloaded->config['enabled'] ) { $wp_db_cache_reloaded->dbcr_clear(); } } //清除缓存 end $wpdb->query( "INSERT INTO $table_name (itime, s_key, s_date) VALUES ('1', '$keyword', now() )" ); } else { $wpdb->query( "UPDATE $table_name SET `itime`= `itime`+'1', `s_date`= now() WHERE `ID`='$sid' " ); } |
系需要的地方加清缓存,咁就冇问题了,但建议只系要即刻显示的地方用,唔重要的,唔急的就唔使了,反正缓存有时限的。
上边两种方法各有各的用处,需要边种方法自然要睇你做乜而定。
例如DB Cache Reloaded系添加、更新文章或者选项果阵就清缓存,如果你的数据有咁重要的话就清缓存,如果只是记录某D数据,例如文章点击数,呢D一D都唔重要的就用方法1够了。
如果有更好的方法请话我知。
该插件貌似不能自动清理过期缓存。。
会啊,正常。