web-dev-qa-db-fra.com

script wp en file d'attente utilisant des scripts de cdn avec un rappel de sécurité

Je souhaite inclure plusieurs scripts et styles à partir d'un CDN distant ... dans ce cas, des fichiers d'amorçage et des fichiers similaires, mais je souhaite fournir un filet de sécurité sous la forme d'un rappel dans le cas où le CDN est en panne pour une raison quelconque ...

J'ajouterais du code mais je ne sais vraiment pas comment aborder cela du tout ...

Voici un exemple de script standard wp_enqueue_ que j'utilise actuellement:

wp_enqueue_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true);
6
Sagive SEO

La réponse acceptée est complètement fausse. Je suspecte un malentendu flagrant sur la question de l'OP, dans la mesure où quiconque a peu d'expérience en programmation ne recommandera jamais quelque chose du genre "cachez votre propre copie du script et effectuera des appels à get_url toutes les 20 minutes".

@Paul G. dit qu'il est inutile de charger depuis le CDN à chaque chargement de page.

C'est tout l'intérêt d'utiliser CDN'S. Si vous ne chargez pas à partir du CDN mais chargez votre copie en cache, le client doit le télécharger à partir de votre serveur. Vous êtes peut-être à Auckland en Nouvelle-Zélande et votre client à Londres. Votre serveur ne pourra jamais faire correspondre un CDN situé plus près du client.

De plus, les CDN utilisent des choses comme NGINX/Varnish, avec des caches énormes qui ne touchent même pas les serveurs. Votre serveur peut utiliser ou non un proxy inverse tel que NGINX avec équilibrage de charge, il peut ou non disposer d’un cache volumineux servant des fichiers statiques. Pour charger votre copie des fichiers, il devra donc passer par toute la pile, ce qui peut être loin de la vitesse que vous obtenez en chargeant des fichiers statiques en cache.

Quoi que vous fassiez, utilisez CDN'S autant que possible, et oui à chaque chargement de page.

Enfin, vous craignez qu’un CDN ne tombe en panne. Si cela se produit, une solution de contournement simple consisterait à mentionner 2 ou 3 autres CDN en tant que solutions de secours. Si le CDN principal échoue, vous pouvez facilement connecter un auditeur et le charger des autres.

Si tous les principaux CDN sont en panne, le vôtre ne sera pas le seul site au monde à ne pas fonctionner, vous pouvez ajouter des éléments tels que Facebook, Imgur, Flckr et un milliard d'autres sites Web qui échoueront avec vous. À ce moment-là, il serait peut-être préférable d'aller dehors et de regarder le ciel, et peut-être trouverez-vous les OVNIS qui ont causé la première défaillance d'un centre de données mondial dans l'histoire de l'humanité.

Réponse courte: Utilisez le Cdn.

Exemple script requirejs pour les URL de secours.

   requirejs.config({
   enforceDefine: true,
   paths: {
       jquery: [
        '//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min',
        //If the CDN location fails, load from this location
        //xyz.com/jquery.min.js
      ]
   }
   });
6
user2076066

J'ai pris le post précédent et fait 2 choses avec:

  • utilise les fonctions d'appel natives WordPress http
  • cache le fait que le CDN est actif pendant 20 minutes (vous pouvez modifier cela). Vous ne voulez vraiment pas obtenir le contenu CDN à CHAQUE chargement de page. Inutile d'accélérer votre site avec les CDN lorsque vous le faites.
$get_the_url = 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js';

$cdnIsUp = get_transient( 'cnd_is_up' );

if ( $cdnIsUp ) {

    $load_source = 'load_external_bootstrap';

} else {

    $cdn_response = wp_remote_get( $get_the_url );

    if( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code($cdn_response) != '200' ) {

        $load_source = 'load_local_bootstrap';

    }
    else {

        $cdnIsUp = set_transient( 'cnd_is_up', true, MINUTE_IN_SECONDS * 20 );
        $load_source = 'load_external_bootstrap';
    }
 }

add_action('wp_enqueue_scripts', $load_source );

function load_external_bootstrap() { 
    wp_register_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true); 
    wp_enqueue_script('bootstrap'); 
}

function load_local_bootstrap() {
    wp_register_script('bootstrap', get_bloginfo('template_url').'/js/bootstrap.min.js', __FILE__, array('jquery'), 3.3, true);
    wp_enqueue_script('bootstrap'); 
}
8
Paul G.

Vous pouvez essayer quelque chose comme ceci pour tester d'abord la version CDN, puis le charger de manière conditionnelle en fonction de sa disponibilité ou non:

$get_the_url = 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js';
    $test_the_url = @fopen( $get_the_url,'r' );

    if ( $test_the_url !== false ) {

        function load_external_bootstrap() { 
        wp_register_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true); 
        wp_enqueue_script('bootstrap'); 

    }

    add_action('wp_enqueue_scripts', 'load_external_bootstrap');

    } else {

        function load_local_bootstrap() {
        wp_register_script('bootstrap', get_bloginfo('template_url').'/js/bootstrap.min.js', __FILE__, array('jquery'), 3.3, true);
        wp_enqueue_script('bootstrap'); 
    }

    add_action('wp_enqueue_scripts', 'load_local_bootstrap');
    }
2
Matt Royal

@ciro a absolument raison de dire que la connexion du serveur n'est pas un test approprié. Le but de la solution de repli est de s’assurer que le document peut être servi au client.

Il y a des pays qui ont bloqué Google (par exemple). Si votre serveur Web est situé en Californie mais que le visiteur se trouve dans un pays où Google est bloqué, cet appel côté serveur PHP testera VRAI, mais le script ne sera pas transmis à l'utilisateur.

Voir Comment mettre en file d'attente un repli jQuery - WordPress pour une méthode qui met en file d'attente avec une sauvegarde locale et teste le client et non le serveur.

2
Mark

Je suis venu avec deux fonctions d'emballage:

function wp_enqueue_cdn_script( $handle, $src_cdn = false, $src_local = false, $deps = array(), $ver = false, $in_footer = false ) {
    $cdnIsUp = get_transient( $handle . '_script_cdn_is_up' );
    if ( $cdnIsUp ) {
        wp_enqueue_script( $handle, $src_cdn, $deps, $ver, $in_footer );
    } else {
        $cdn_response = wp_remote_get( $src_cdn );
        if ( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code( $cdn_response ) != '200' ) {
            wp_enqueue_script( $handle, $src_local, $deps, $ver, $in_footer );
        } else {
            $cdnIsUp = set_transient( $handle . '_script_cdn_is_up', true, MINUTE_IN_SECONDS * 20 );
            wp_enqueue_script( $handle, $src_cdn, $deps, $ver, $in_footer );
        }
    }
}

function wp_enqueue_cdn_style( $handle, $src_cdn = false, $src_local = false, $deps = array(), $ver = false, $media = 'all' ) {
    $cdnIsUp = get_transient( $handle . '_style_cdn_is_up' );
    if ( $cdnIsUp ) {
        wp_enqueue_style( $handle, $src_cdn, $deps, $ver, $media);
    } else {
        $cdn_response = wp_remote_get( $src_cdn );
        if ( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code( $cdn_response ) != '200' ) {
            wp_enqueue_style( $handle, $src_local, $deps, $ver, $media);
        } else {
            $cdnIsUp = set_transient( $handle . '_style_cdn_is_up', true, MINUTE_IN_SECONDS * 20 );
            wp_enqueue_style( $handle, $src_cdn, $deps, $ver, $media);
        }
    }
}

Mais je me demande si c'est vraiment utile: cela surcharge le serveur, et nous prétendons que si le serveur peut atteindre le CDN, le client le peut aussi, ce qui n'est pas toujours le cas dans la réalité.

2
Ciro Mattia Gonano