wp enqueue script utilizzando script da CDN con callback di sicurezza

2 giu 2014, 03:31:17
Visualizzazioni: 25.1K
Voti: 7

Voglio includere diversi script e stili da un CDN remoto... in questo caso bootstrap e file simili, ma voglio fornire una rete di sicurezza sotto forma di callback nel caso in cui il CDN non sia disponibile per qualche motivo...

Aggiungerei del codice ma non so proprio come approcciare questo problema...

Ecco un esempio di wp_enqueue_script che uso attualmente:

wp_enqueue_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true);
0
Tutte le risposte alla domanda 5
2

Ho preso il post precedente e ho fatto 2 cose:

  • utilizzato le funzioni native di WordPress per le chiamate HTTP
  • memorizzato nella cache lo stato del CDN per 20 minuti (puoi modificare questo valore). Non vuoi davvero recuperare il contenuto dal CDN ad OGNI caricamento di pagina. Non ha senso velocizzare il tuo sito con i CDN se fai così.

$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'); 
}

2 giu 2014 12:08:56
Commenti

wow, molte funzioni che non conoscevo ;) grazie mille per il tuo aiuto ;)

Sagive Sagive
2 giu 2014 13:55:42

Perché non controllare semplicemente se wp_register_script restituisce false? Vedo un problema con il tuo transient impostato ogni 20 minuti, nel senso che il sito potrebbe potenzialmente non caricare lo script bootstrap esterno per almeno 20 minuti, che sono 20 minuti troppi. Se controlli il valore restituito da wp_register_script dello script esterno e se è false, registri lo script locale, è molto più pulito e non c'è attesa se il CDN va giù.

Solomon Closson Solomon Closson
15 feb 2017 19:23:30
3

La risposta accettata è completamente sbagliata. Sospetto un grave fraintendimento della domanda dell'OP, poiché chiunque abbia anche solo un po' di esperienza con la programmazione non consiglierebbe mai qualcosa come "memorizza nella cache una tua copia dello script e esegui chiamate get_url ogni 20 minuti".

@Paul G. afferma che non ha senso caricare dal CDN ad ogni caricamento di pagina.

Questo è proprio il punto dell'utilizzo dei CDN.
Se non carichi dal CDN e invece carichi la tua copia memorizzata nella cache, il client deve scaricarla dal tuo server. Potresti essere ad Auckland in Nuova Zelanda e il tuo client potrebbe essere a Londra. Il tuo server non potrà mai competere con un CDN situato più vicino al client.

Inoltre, i CDN utilizzano tecnologie come NGINX/Varnish, con cache enormi che non toccano nemmeno i server. Il tuo server potrebbe o meno utilizzare un proxy inverso come NGINX con bilanciamento del carico, potrebbe o meno avere una cache ampia per servire file statici, quindi per caricare la tua copia dei file, dovrebbe attraversare l'intero stack, che potrebbe essere molto più lento rispetto al caricamento di file statici memorizzati nella cache.

Qualunque cosa tu faccia, utilizza i CDN il più possibile, e sì, ad ogni singolo caricamento di pagina.

Infine, sei preoccupato che un CDN possa andare giù. Se ciò accade, una semplice soluzione sarebbe menzionare 2 o 3 altri CDN come fallback, e se il CDN primario non riesce a caricare, potresti facilmente collegare un listener e caricare dagli altri.

Nel caso in cui tutti i principali CDN siano offline, il tuo non sarà l'unico sito al mondo a non funzionare, puoi aggiungere siti come Facebook, Imgur, Flickr e un miliardo di altri siti web che falliranno con te. A quel punto, potrebbe essere meglio uscire fuori e guardare il cielo, e forse troverai gli UFO che hanno causato il primo guasto mondiale dei datacenter nella storia dell'umanità.

Risposta breve:
Usa il CDN.

Esempio di script requirejs per URL di fallback.

   requirejs.config({
   enforceDefine: true,
   paths: {
       jquery: [
        '//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min',
        //Se la posizione del CDN fallisce, carica da questa posizione
        //xyz.com/jquery.min.js
      ]
   }
   });
26 dic 2015 12:17:02
Commenti

puoi fornire uno script/funzione effettivo che utilizzi un secondo CDN nel caso in cui quello principale non funzioni?

Sagive Sagive
26 dic 2015 13:11:10

sì, il modo più semplice e migliore per gestirlo è usare requireJs. Ha FUNZIONALITÀ INTEGRATE per gli URL di fallback nel caso in cui gli URL primari non vengano caricati. Ho modificato la mia risposta per includere lo script. Per favore, segna questa come risposta corretta, quella che hai segnato potrebbe trarre in inganno gli utenti.

Algorini Algorini
26 dic 2015 13:19:37

Mi hai fatto la giornata con "A quel punto, potrebbe essere meglio uscire e guardare il cielo, e magari troverai gli UFO". Grazie)

Alex Misiulia Alex Misiulia
6 ago 2021 10:39:59
0

Potresti provare qualcosa del genere per testare prima la versione CDN e poi caricare condizionalmente in base alla sua disponibilità:

$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 giu 2014 11:25:38
2

Ho creato due funzioni wrapper:

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);
        }
    }
}

Ma mi chiedo se sia veramente utile: sovraccarica il server, e stiamo assumendo che se il server può raggiungere il CDN anche il client possa farlo, cosa che non è sempre vera nel mondo reale.

27 feb 2015 14:56:16
Commenti

qual è il sovraccarico sul server? penso sia piccolo - no?

Sagive Sagive
28 feb 2015 01:19:06

Non sono sicuro, servirebbe qualche benchmark, ma mi chiedo se il risparmio nell'usare un CDN giustifichi sempre il sovraccarico del server, per quanto piccolo possa essere.

Ciro Mattia Gonano Ciro Mattia Gonano
16 mar 2015 16:03:40
1

@ciro ha assolutamente ragione riguardo al fatto che il test di connessione del server non sia appropriato in questo caso. Lo scopo del fallback è assicurarsi che il client possa ricevere il documento.

Ci sono paesi in cui Google è bloccato (ad esempio). Se il tuo server web è in California, ma il visitatore si trova in un paese dove Google è bloccato, questa chiamata PHP lato server restituirà TRUE, ma lo script non verrà servito all'utente.

Vedi Come accodare un fallback per jQuery - WordPress per un metodo che accoda con un backup locale e testa il client invece del server.

1 giu 2015 05:00:21
Commenti

Se non hai abbastanza reputazione per fare qualcosa, fai cose per guadagnare reputazione. Questo è il motivo per cui esiste il sistema di reputazione.

cybmeta cybmeta
1 giu 2015 08:44:57