用户首次登录时,多站点WP不是缓存选项:超过1000个SQL查询

时间:2014-04-16 15:18:46

标签: wordpress caching

我有一个多站点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次查询?

0 个答案:

没有答案