Adăugarea script-urilor în WordPress folosind CDN cu funcție de siguranță

2 iun. 2014, 03:31:17
Vizualizări: 25.1K
Voturi: 7

Vreau să includ mai multe script-uri și stiluri de la un CDN remote... în acest caz fișiere bootstrap și similare, dar vreau să ofer o plasă de siguranță sub forma unui callback în cazul în care CDN-ul nu funcționează din anumite motive...

Aș adăuga niște cod, dar chiar nu știu cum să abordez acest lucru deloc...

Iată un exemplu de wp_enqueue_script obișnuit pe care îl folosesc în prezent:

wp_enqueue_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true);
0
Toate răspunsurile la întrebare 5
2

Am luat postarea anterioară și am făcut 2 lucruri cu ea:

  • folosește funcțiile native WordPress pentru apeluri HTTP
  • stochează în cache starea CDN-ului pentru 20 de minute (poți ajusta această valoare). Nu ai nevoie să verifici CDN-ul la FIECARE încărcare de pagină. Nu are sens să accelerezi site-ul cu CDN-uri dacă faci asta.

$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 iun. 2014 12:08:56
Comentarii

wow, multe funcții pe care nu le știam ;) mulțumesc mult pentru ajutor ;)

Sagive Sagive
2 iun. 2014 13:55:42

De ce să nu verifici pur și simplu dacă wp_register_script returnează false? Văd o problemă cu transient-ul tău setat la fiecare 20 de minute, în sensul că site-ul ar putea să nu încarce scriptul extern bootstrap pentru cel puțin 20 de minute, ceea ce înseamnă 20 de minute prea multe. Dacă verifici valoarea returnată de wp_register_script pentru scriptul extern și dacă este false, înregistrezi scriptul local, este mult mai curat și nu există așteptare dacă CDN-ul cade.

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

Răspunsul acceptat este complet greșit. Bănuiesc o neînțelegere gravă a întrebării OP, deoarece oricine cu chiar și puțină experiență în programare nu va recomanda niciodată ceva de genul "cachéază-ți propria copie a scriptului și efectuează apeluri get_url la fiecare 20 de minute".

@Paul G. spune că nu are sens să încarci de pe CDN la fiecare încărcare de pagină.

Tocmai acesta este scopul utilizării CDN-urilor. Dacă nu încarci de pe CDN și în schimb încarci copia ta cache, clientul trebuie să o descarce de pe serverul tău. Tu poți fi în Auckland, Noua Zeelandă, iar clientul tău poate fi în Londra. Serverul tău nu va putea niciodată să concureze cu un CDN situat mai aproape de client.

Mai mult, CDN-urile folosesc tehnologii precum NGINX/Varnish, cu cache-uri masive care nici măcar nu ating serverele. Serverul tău poate sau nu să folosească un reverse proxy precum NGINX cu load balancing, poate sau nu să aibă un cache mare pentru servirea fișierelor statice, așa că pentru a încărca copia ta a fișierelor, va trebui să parcurgă întregul stack, care poate fi departe de viteza pe care o obții prin încărcarea fișierelor statice din cache.

Orice ai face, folosește CDN-uri cât mai mult posibil, și da, la fiecare încărcare de pagină.

În final, îți faci griji că un CDN ar putea cădea. Dacă se întâmplă asta, o soluție simplă ar fi să menționezi 2-3 alte CDN-uri ca backup, iar dacă CDN-ul principal nu reușește să se încarce, poți conecta cu ușurință un listener și să încarci de pe celelalte.

În cazul în care toate CDN-urile majore sunt down, site-ul tău nu va fi singurul din lume care nu funcționează, poți adăuga în listă site-uri precum Facebook, Imgur, Flickr și un miliard de alte site-uri care vor eșua împreună cu tine. În acel moment, poate ar fi mai bine să ieși afară și să te uiți la cer, poate vei vedea OZN-urile care au cauzat prima cădere mondială a datacenterelor din istoria omenirii.

Răspuns scurt: Folosește CDN-ul.

Exemplu de script requirejs pentru URL-uri alternative:

   requirejs.config({
   enforceDefine: true,
   paths: {
       jquery: [
        '//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min',
        //Dacă locația CDN eșuează, încarcă de aici
        //xyz.com/jquery.min.js
      ]
   }
   });
26 dec. 2015 12:17:02
Comentarii

poți oferi un script/funcție reală care să folosească un al doilea CDN în cazul în care cel principal nu funcționează?

Sagive Sagive
26 dec. 2015 13:11:10

da, cea mai simplă și eficientă metodă de a rezolva această problemă este să folosești requireJs. Are FUNCȚIONALITATE INTEGRATĂ pentru URL-uri de rezervă în cazul în care URL-urile principale nu se încarcă. Am editat răspunsul meu pentru a include scriptul. Te rog să marchezi acest răspuns ca fiind cel corect, cel pe care l-ai marcat va induce în eroare utilizatorii.

Algorini Algorini
26 dec. 2015 13:19:37

Mi-ai făcut ziua mai bună cu "În acel moment, poate ar fi mai bine să ieși afară și să te uiți la cer, poate vei găsi OZN-urile". Mulțumesc)

Alex Misiulia Alex Misiulia
6 aug. 2021 10:39:59
0

Puteți încerca ceva de genul acesta pentru a testa mai întâi versiunea CDN și apoi să încărcați condiționat în funcție de disponibilitate:

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

Am creat două funcții 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);
        }
    }
}

Dar mă întreb dacă sunt cu adevărat utile: supraîncarcă serverul și presupunem că dacă serverul poate accesa CDN-ul, atunci și clientul poate, ceea ce nu este întotdeauna adevărat în lumea reală.

27 feb. 2015 14:56:16
Comentarii

Care este suprasarcina pe server? Cred că este una mică - nu?

Sagive Sagive
28 feb. 2015 01:19:06

Nu sunt sigur, ar fi nevoie de unele teste de performanță, dar mă întreb dacă economiile folosind un CDN justifică întotdeauna suprasarcina serverului, oricât de mică ar putea fi.

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

@ciro are absolut dreptate cu privire la faptul că testarea conexiunii serverului nu este potrivită pentru acest caz. Scopul soluției de rezervă (fallback) este să ne asigurăm că clientul poate primi documentul.

Există țări în care Google este blocat (de exemplu). Dacă serverul tău web se află în California, dar vizitatorul este într-o țară unde Google este blocat, acest apel PHP pe partea de server va returna TRUE, dar scriptul nu va fi servit utilizatorului.

Consultați Cum să încărci jQuery ca soluție de rezervă - WordPress pentru o metodă care încarcă cu o copie locală de rezervă și testează clientul, nu serverul.

1 iun. 2015 05:00:21
Comentarii

Dacă nu ai suficientă reputație pentru a face ceva, fă lucruri pentru a câștiga reputație. Tocmai de aceea există sistemul de reputație.

cybmeta cybmeta
1 iun. 2015 08:44:57