我有一个多站点WP站点(WP 3.1.4,有大约300个站点)。有一段时间了,我注意到有人第一次登录(他们已经注册后),它可以很容易地用10-20秒。
我使用newrelic设置监控,我看到,当用户第一次登录时,该站点使用
查询数据库SELECT option_name, option_value FROM wp_?_options WHERE autoload = ?
超过1000次(和其他非常相似的重复查询几百次)。
我非常确定这是从wp_load_alloptions()函数调用的,该函数用于查询选项一次,然后在页面加载的其余部分缓存它们。 (注意:我不使用任何缓存插件。)
我添加了一些非常简单的回声"登录我的测试网站:
function wp_load_alloptions() {
global $wpdb;
if ( !defined( 'WP_INSTALLING' ) || !is_multisite() ) {
$alloptions = wp_cache_get( 'alloptions', 'options' );
} else {
$alloptions = false;
}
if ( !$alloptions ) {
echo "<!-- alloptions cache empty -->";
$suppress = $wpdb->suppress_errors();
if ( !$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'" ) ) {
echo "<!-- alloptions loading without autoload -->";
$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" );
}
$wpdb->suppress_errors($suppress);
$alloptions = array();
foreach ( (array) $alloptions_db as $o ) {
$alloptions[$o->option_name] = $o->option_value;
}
$size = count($alloptions);
echo "<!-- alloptions size: {$size} -->";
if ( !defined( 'WP_INSTALLING' ) || !is_multisite() ){
echo "<!-- saving alloptions -->";
wp_cache_add( 'alloptions', $alloptions, 'options' );
}
}
return $alloptions;
}
当预先存在的用户登录时,缓存正常工作:在我的页面顶部,我看到
<!-- alloptions cache empty --><!-- alloptions size: 123 --><!-- saving alloptions -->
但是当用户第一次登录时,我会看到这三个评论滚动到无穷大,因为$ alloptions从未真正保存过。
有关如何确保在一个查询中缓存新用户选项的任何想法,因此我不必进行1000次查询?