web-dev-qa-db-fra.com

Utilisez override_load_textdomain pour la traduction du cache et améliorer les performances

J'ai un wordpress multisite avec plusieurs sites localisés (es_ES, de_DE, it_IT). Je veux améliorer la vitesse de la page en mettant en cache le fichier de traduction wordpress.

Mon code fonctionne (inspiré par Tristan Darricau )! et ma vitesse de page est améliorée de 0,50 secondes.

Maintenant, ma question est la suivante: mon code est correct ou peut casser quelque chose (noyau, thème, plug-in), j'ai testé et cela semble fonctionner, mais je suis un novice de 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);

Note latérale: Je sais que ceci est une question pour la plate-forme de révision de code , mais tous les wordpress'guys sont ici, et ceci est une question pour wordpress'guys.

Je m'excuse pour mon mauvais anglais

4
ar099968

Il semble que votre code est correct et qu'il ne casse rien, mais pour qu'il fonctionne correctement sur différentes pages, vous devriez peut-être utiliser API transitoire fonctions au lieu de Cache d'objet contreparties.

Pourquoi?

Le cache d'objets n'est pas persistant par défaut (c'est-à-dire qu'il ne fonctionne pas sur différentes pages). Il ne persistera que si vous installez un plug-in de cache persistant et un système de cache persistant (par exemple, redis, memcached).

L'API transitoire fonctionne un peu "plus intelligemment": elle garde le contenu mis en cache sur la base de données à utiliser "de manière persistante" s'il n'y a pas de cache d'objet persistant, mais utilisera l'API de cache d'objet s'il existe un backend et un plugin de cache persistant.

Utilisez l'API transitoires à la place de ces fonctions si vous devez vous assurer que vos données seront mises en cache. Si la mise en cache persistante est configurée, les fonctions transitoires utiliseront les fonctions wp_cache décrites dans ce document. Toutefois, si la mise en cache persistante n'a pas été activée, les données seront alors mises en cache dans la table d'options.

(source: https://codex.wordpress.org/Class_Reference/WP_Object_Cache )

Sachez que les performances de la base de données peuvent être affectées, testez et mesurez avec soin.

1
Celso Bessa

Le seul problème qui semble concerner ce code/cette idée est que vous mettez en cache la traduction entière au lieu de mettre en cache les nœuds de traduction (les expressions étant en cours de traduction). Cela entraîne une demande de mémoire plus importante de la part du système de mise en cache, mais probablement pas de manière significative (l'hypothèse de base est que vous utilisez également un plugin de mise en cache d'objet, sinon tout le code est inutile)

1
Mark Kaplun