• User Attivo

    Wp-rocket con Varnish e Control Key

    Salve a tutti,
    recentemente ho migrato un sito su nuovo hosting, quest'ultimo fra i servizi mette a disposizione anche Varnish

    Ora è venuto fuori che per purgare la cache Varnish è necessario usare questo plugin https://it.wordpress.org/plugins/purge-varnish/ in quanto ( riposto dal supporto dell'hosting e confermato da wp-rocket) il layer Varnish in questione usa il Varnish Control Key, mentre l'add-on Varnish di Wp-rocket no ( e mi hanno appena risposto picche via mail)

    La situazione corrente è quindi che ogni volta che modifico un articolo, parte sia il purge automatico di Wp-rocket cache, sia quello di varnish dal plugin sopracitato. Il problema è che parte prima quello di Varnish e dopo la cache di wp-rocket, risultato che varnish purga e riprende la cache di wp-rocket e quindi non aggiorna il contenuto, o per lo meno crea anomalie del genere

    il quesito tecnico per chi ha gia avuto esperienze del genere o chi smanetta sul codice: c'è un modo per far partire prima il comando purge di wp-rocket e dopo quello di Varnish ? considerando che sono due plugin diversi...
    che ne so, un hook, un filter, action , un cron job o qualcosa del genere

    il tutto mi servirebbe per non dover purgare manualmente Varnish ad ogni aggiunta o modifica di post

    Le alternative non tecniche le valuterò in secondo momento, ma al momento vorrei tenere Wp-rocket e Varnish, poi una volta trovata o meno una soluzione tecnica valuterò se disattivare varnish o meno, se cambiare wp-rocket o meno ecc.

    E' molto probabile che cambierò comunque hosting perche hanno un supporto ticket da vergogna ( non Aruba e non Siteground, strano)


  • Moderatore

    Ciao @shazarak quello che puoi fare è cercare nel core dei plugin le funzioni add_action e vedere quando l'evento viene scatenato in entrambi i plugin e modificare quello rimuovendoli prima con remove_action e poi riagiungerli dopo con una priorità diversa di nuovo con add_action.

    Qui trovi maggiori info sulla documentazione WordPress:

    https://developer.wordpress.org/plugins/hooks/actions/
    https://developer.wordpress.org/reference/functions/add_action/
    https://developer.wordpress.org/reference/functions/remove_action/


    shazarak 1 Risposta
  • User Attivo

    @overclokk urka grazie ! mi hai fatto fare un passaggio avanti 🙂
    nel frattempo Wp-rocket mi ha risposto cosi:

    You can write a function to send a request according to the plugin's docs and hook it to:
    after_rocket_clean_domain for clearing the Varnish's cache after WP Rocket's:
    https://github.com/wp-media/wp-rocket/blob/443f2e1b902c592bd517cbaa641571bb2ddce1a5/inc/functions/files.php#L783

    after_rocket_clean_post for clearing the Varnish's cache after clearing the cache of a post:
    https://github.com/wp-media/wp-rocket/blob/443f2e1b902c592bd517cbaa641571bb2ddce1a5/inc/common/purge.php#L253

    girovagando ho trovato degli esempi di utilizzo come questo:
    add_action( 'after_rocket_clean_domain', function() {
    rocket_clean_files( array(
    'https://example.com/foo/',
    'https://example.com/bar/',
    ));
    });
    dove suppongo dovrei sostituire rocket_clean_files() con la funzione che dovrebbe sparare il pure di varnish

    il problema è che aimè finora nel plugin esterno, l'unico codice trovato per purgare varnish è questo:
    $purge_varnish = new Purge_Varnish();

    if (isset($_POST['purge']) && $_POST['purge'] == 'Purge') {
    if($purge_varnish->purge_varnish_nonce('pvUrls') == true) {
    $urls = array_filter($_POST['urls']);
    // Sanitize internally.
    $msg = $purge_varnish->purge_varnish_url($urls);
    }
    }
    riferito al bottone della sua pagina dedicata in admin... e la vedo un po problematica per le mie competenze creare una funzione che spari il purge da mettere dentro l'hook di wp-rocket


    overclokk 1 Risposta
  • Moderatore

    @shazarak ha detto in Wp-rocket con Varnish e Control Key:

    $purge_varnish = new Purge_Varnish();
    if (isset($_POST['purge']) && $_POST['purge'] == 'Purge') {
    if($purge_varnish->purge_varnish_nonce('pvUrls') == true) {
    $urls = array_filter($_POST['urls']);
    // Sanitize internally.
    $msg = $purge_varnish->purge_varnish_url($urls);
    }
    }

    E quando viene eseguito?


    shazarak 2 Risposte
  • User Attivo

    @overclokk alura, quel codice viene eseguito quando da admin, nella sezione Purge All di quel plugin, clicchi il bottone Purge all, che manda un submit POST a se stesso...
    in realtà dopo la tua riposta sono andato a cercare possibili add_action nei file di quel plugin ma mi sono arreso quando dentro al file principale class_purge_varnish.php ho trovato cose del genere add_action($action, array($purge_varnish, 'purge_varnish_post_updated_trigger'));

    mi piacerebbe capire come farlo funzionare ma solo per mio "capriccio" di imparare il più possibile, ma mi sono dovuto fermare perchè cliente e progetto non richiedono tutto questo dispendio di energie. per ora pubblico io un articolo o due al mese, e posso "pigiare" sul bottone clear varnish... Se in futuro dovessi dare in mano al cliente, o gli disabilito varnish o gli cambio hosting, o gli rifaccio il sito senza quel tema orrendo usato, cosi non ho piu bisogno di varnish e siamo a posto 😛


  • User Attivo

    @overclokk incredibile ma credo di esserci riuscito:

    // esegue il comando quando cancello la cache di wp-rocket manualmente dal link nella toolbar
    add_action('after_rocket_clean_domain','purge_ao_rocket',10,0);
    // esegue il comando quando aggiorno un post/pagina dalla relativa sezione
    add_action('after_rocket_clean_post','purge_ao_rocket',10,0);
    function purge_ao_rocket() {
    $message = '';
    $purge_varnish = new Purge_Varnish();
    if($purge_varnish->purge_varnish_nonce('purgeAllCache') == true) {
    $response = $purge_varnish->purge_varnish_all_cache_manually();
    }
    //mi manda una mail con il responso "purge successfully purged" - solo per debug
    $message = "Results: " . print_r( $response, true );
    wp_mail("[email protected]", "Subject", $message ) ;
    }

    è un po grezzo, e tra l'altro di purga tutta la cache intera, ma diciamo che ottengo il risultato voluto...


  • Moderatore

    @shazarak ha detto in Wp-rocket con Varnish e Control Key:

    La situazione corrente è quindi che ogni volta che modifico un articolo, parte sia il purge automatico di Wp-rocket cache, sia quello di varnish dal plugin sopracitato. Il problema è che parte prima quello di Varnish e dopo la cache di wp-rocket, risultato che varnish purga e riprende la cache di wp-rocket e quindi non aggiorna il contenuto, o per lo meno crea anomalie del genere

    All'inizio hai scritto così, ora se tu lanci il flush della cache Varnish anche tramite WP_Rocket la cache verrà eliminata 3 volte e non 2, o forse ho capito male io?


    shazarak 1 Risposta
  • User Attivo

    @overclokk si guarda tutto sto bordello per poi trovare la pecca finale a sorpresa..
    wp-rocket installato, ovviamente se modifichi un post, lui purga la sua cache, e fin qui ci siamo
    in teoria, con add-on varnish attivo, ogni volta che wp-rocket purga la propria cache manda comando per bannare anche la cache del layer varnish.
    la pratica vuole che con questo particolare hosting il layer varnish necessita un Control Key da inviare insieme al comando ban. questa "particolarità" esclude la possibilità di utilizzare il Varnish Add-on di Wp-rocket e obbliga ad usare questo altro plugin ( che invece accetta il settaggio del contro key e dialoga con varnish via socket ecc)

    il problema stava nel fatto che il plugin Varnish Purge anche lui purga in automatico la cache varnish quando un post viene creato/mod/del, ma purtroppo lo fa prima del purge di wp-rocket e quindi per nulla

    quindi fino a stamani le operazioni erano:

    1. creo/modifico/elimino articolo
    2. Varnish Purge plugin manda un purge automatico inutile
    3. wp-rocket purga in automatico la propria cache
    4. io vado nel pannello di Varnish Purge e a mano clicco su "purga tutto"
    5. e finalmente tutto funziona

    avendo ricevuto da Wp-rocket i due hook da usare per lanciare funzioni "dopo" il loro purge automatico, ho trovato poco fa il codice dall'altro plugin che sembra funzionare, morale al momento

    1. creo/modifico/elimino articolo
    2. Varnish Purge non manda nulla perche ho disabilitato il purge automatico sul add/mod/del dei post
    3. wp-rocket purga in automatico la propria cache
    4. viene sparato l'hook che invia il purge a varnish

    e sembrava funzionare tutto alla perfezione. e probabilmente per ora lo tengo cosi (a meno che mi illumini su migliorie ecc)

    la sorpresa finale, è che 10 minuti fa ho svuotato il cestino degli articoli trashati e ho scoperto ( ricevo una mail ogni volta che viene purgata la cache) che con la action ricevuta da Wp-rocket viene purgata la cache anche quando si cancella il cestino! --- ho ricevuto 18 mail per 18 articoli che cancellati dal cestino---

    motivo per cui ora ho scritto a wp-rocket per chiedere motivazioni della cosa.
    ma in generale diciamo che per ora ho chiuso il cerchio


  • Miglior Risposta
    Moderatore

    Ok, ora è più chiaro, quindi hai attivo il plugin ma disattivate le funzioni di flush, ok.

    Se da dentro la funzione eseguita durante 'after_rocket_clean_post' riesci ad ottenere l'ID del post (puoi vedere se do_action('after_rocket_clean_post' /**[, ?...$args ]**/) passa qualche parametro) allora puoi fare un check tipo questo:

    $post = get_post( $post_id );
    
    if ( ! $post ) {
        return;
    }
    
    if ( 'trash' === $post->post_status ) {
        return;
    }
    

    Dal post ID ottieni il post object, verifichi che $post esista, verifichi che il post status non sia trash.


    shazarak 1 Risposta
  • User Attivo

    @overclokk urka urka grazie! sta cosa poi me la studio e provo di sicuro 🙂