使用OVERRIDE_LOAD_TextDOMAIN进行缓存转换并提高性能

时间:2016-06-25 作者:ar099968

我有一个多站点wordpress,有多个本地化站点(es\\es,de\\u de,it\\u it)。我想通过缓存wordpress翻译文件来提高页面速度。

我的代码有效(灵感来自Tristan Darricau)! 我的页面速度提高了0.50秒。

现在,我的问题是:我的代码是正确的,或者可以破坏某些东西(核心、主题、插件),我已经测试过,它似乎可以工作,但我是wp的新手!

/**
 * Cache translation
 * @param boolean $override
 * @param string  $domain
 * @param string  $mofile
 * @return boolean
 */
function my_override_load_textdomain($override, $domain, $mofile) {

    global $l10n;

    // check if $mofile exisiste and is readable
    if ( !(is_file($mofile) && is_readable($mofile)) ){
        return false;
    }

    // creates a unique key for cache
    $key   = md5($mofile);

    // I try to retrive data from cache
    $data  = wp_cache_get($key, $domain);

    // Retrieve the last modified date of the translation files
    $mtime = filemtime($mofile);

    $mo = new \\MO();

    // if cache not return data or data it\'s old
    if ( !$data || !isset($data[\'mtime\']) || ($mtime > $data[\'mtime\']) ) {
        // retrive data from MO file
        if ( $mo->import_from_file( $mofile ) ){

            $data = array(
                \'mtime\'   => $mtime,
                \'entries\' => $mo->entries,
                \'headers\' => $mo->headers
            );

            // save data in cache
            wp_cache_set($key, $data, $domain, 0);

        } else {
            return false;
        }

    } else {
        $mo->entries = $data[\'entries\'];
        $mo->headers = $data[\'headers\'];
    }

    if ( isset( $l10n[$domain] ) ) {
        $mo->merge_with( $l10n[$domain] );
    }

    $l10n[$domain] = &$mo;

    return true;
}
add_filter(\'override_load_textdomain\', \'my_override_load_textdomain\',1,3);
旁注:我知道这是一个code review stack\'s platform, 但所有wordpress的人都在这里,这是wordpress的人要问的问题。

我为我的英语不好道歉

2 个回复
最合适的回答,由SO网友:Celso Bessa 整理而成

看起来你的代码还可以,不会破坏任何东西,但要让它在不同的页面上正常工作,也许你应该使用Transient API 函数而不是Object Cache 副本。

为什么?

默认情况下,对象缓存不是持久的(即不跨不同页面工作)。只有安装了持久缓存插件和持久缓存后端(例如redis、memcached),它才会持久。

瞬态API工作得更“聪明”:如果没有持久对象缓存集,它会保持数据库中缓存的内容“持久”使用,但如果有持久缓存后端和插件,它会使用对象缓存API。

如果需要保证数据将被缓存,请使用Transients API而不是这些函数。如果配置了持久缓存,则瞬态功能将使用本文档中描述的wp\\U缓存功能。但是,如果尚未启用持久缓存,则数据将被缓存到选项表中。

(来源:https://codex.wordpress.org/Class_Reference/WP_Object_Cache )

请注意,数据库性能可能会受到影响,因此,请仔细测试和测量。

SO网友:Mark Kaplun

该代码/想法似乎存在的唯一问题是,您正在缓存整个翻译,而不是缓存翻译节点(实际翻译的短语)。这会导致缓存系统对内存的要求更高,但可能不会有任何显著的影响(基本假设是您也使用了一些对象缓存插件,否则整个代码都没有意义)

相关推荐

Post types translation

我尝试翻译帖子类型名称(帖子、页面和附件)。我有以下代码:function create_skip_post_types_box () { $post_types = get_post_types(array(\'public\'=>true), \'names\' ); $opt = $this->_get_option(); $skip_types = is_array(@$opt[\'skip_post_types\