cachare sito in php

Achille610@

Utente Attivo
18 Apr 2017
75
0
6
51
Ciao a tutti,
mi piacerebbe capire come posso cachare le pagine del mio sito in php...

qualcuno mi sa dire dove posso prendere spunto o capire come e da dove iniziare ? il sito tra l'altro e dinamico, non so se in questo caso la cosa sia diversa

grazie a tutti
 
ho trovato questo articolo: https://www.mrw.it/php/classe-gestione-cache-pagine-dinamiche_11660.html

ma stranamente non è spiegato molto bene come solitamente sul Vostro sito


la classe ma non dice se va inserita in pagina, oppure se bisogna recuperarla con un require o include, tra l'altro da i parametri da mettere prima e dopo ma anche qui non fa capire se e come includerla ...

qualcuno può gentilmente illuminarmi :)

grazie

PHP:
class php_cache{
  var $durata;
  var $cache_url;
  var $nome_pagina;
 
  /*
  Costruttore - i parametri sono:
  1) i minuti di vita della cache
  2) il percorso della cartella di cache
  */
  function __construct($minuti,$cartella) {
   $this->durata = intval($minuti) * 60;
   $this->cache_url = rtrim($cartella,'/').'/';
  }
 
  // Funzione di start della cache
  function start() {   
   $this->nome_pagina = $this->cache_url.''.$this->paginaCorrente();
   if (file_exists($this->nome_pagina) && ((time() - $this->durata) < filemtime($this->nome_pagina)))
   {
     echo file_get_contents(md5($this->nome_pagina));
     exit;
   }else{
     ob_start();
   }
  }
 
  // Funzione di chiusura della cache
  function stop() {
   $file = fopen($this->nome_pagina, 'w');
   fwrite($file, ob_get_contents());
   fclose($file);
   ob_end_flush();   
  }
 
  // Metodo che restituisce il nome della pagina [eventuali parametri compresi]
  function paginaCorrente() {
   $pagina_corrente = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
   $pezzi = explode('/',$pagina_corrente);
   $pagina_corrente = $pezzi[count($pezzi)-1];
   return md5($pagina_corrente);
  }
}

parametri da mettere prima e dopo

$cache = new php_cache(10,'cache/');
$cache->start();

// segue il codice php/html
// ...
// ...

$cache->stop();
 
L'inclusione non cambia nulla alla funzionalità della classe, serve solo a non dover ripetere la stessa cosa per ogni pagina del sito, quindi se di intero sito si tratta, ma anche di singola pagina, crei un file ad arte con quella classe dentro e poi la includi la dove devi utilizzarla.
Per il resto mi pare chiaro, prima la metti nel file ( direttamente o via inclusione, scegli tu ) poi la richiami, la inizializzi con lo start() e dopo tutto il codice PHP/HTML che forma la tua pagina, gli dai lo stop().
 
Ciao grazie mille per la risposta @MarcoGrazia
ho fatto cosi ma sembra non funzionare :(

PHP:
<?php
require "cache-page.php" ;
$cache = new php_cache(10,'cache/');
$cache->start();

?>
<!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7 no-js" lang="en-US">
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8 no-js" lang="en-US">
<![endif]-->
<!--[if !(IE 7) | !(IE 8)  ]><!-->
<html lang="en" class="no-js">
<head>


----------

</html>
<?php

$cache->stop();

?>


la classe l'ho messa in cache-page.php

<?php

class php_cache{
  var $durata;
  var $cache_url;
  var $nome_pagina;

  /*
  Costruttore - i parametri sono:
  1) i minuti di vita della cache
  2) il percorso della cartella di cache
  */
  function __construct($minuti,$cartella) {
   $this->durata = intval($minuti) * 60;
   $this->cache_url = rtrim($cartella,'/').'/';
  }

  // Funzione di start della cache
  function start() {
   $this->nome_pagina = $this->cache_url.''.$this->paginaCorrente();
   if (file_exists($this->nome_pagina) && ((time() - $this->durata) < filemtime($this->nome_pagina)))
   {
     echo file_get_contents(md5($this->nome_pagina));
     exit;
   }else{
     ob_start();
   }
  }

  // Funzione di chiusura della cache
  function stop() {
   $file = fopen($this->nome_pagina, 'w');
   fwrite($file, ob_get_contents());
   fclose($file);
   ob_end_flush();
  }

  // Metodo che restituisce il nome della pagina [eventuali parametri compresi]
  function paginaCorrente() {
   $pagina_corrente = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
   $pezzi = explode('/',$pagina_corrente);
   $pagina_corrente = $pezzi[count($pezzi)-1];
   return md5($pagina_corrente);
  }
}

?>
 
Mha!
A leggere il codice, vedo che la pagina semplicemente viene salvata con l'hash del nome ( in md5 ) e poi quando ripassi viene confrontato il tempo di creazione della stessa in modo da riferirsi sempre a quella copia se non è passato il tempo che gli hai dato con start(). Che poi il caching sostanzialmente è tutto qui :D
Dopo di che, se il tempo è passato la risalva con un altro hash nome md5().
Difetti:
  • un sistema di cache non dovrebbe fare il caching di pagine statiche, non serve a nulla, anzi è controproducente;
  • è semplicistico, il che non dovrebbe essere proprio un difetto;
Per vedere se funziona non dovresti provarlo in locale, a occhio nudo non vedi le differenze, inoltre dovresti fare un ping verso il sito senza caching e con caching per vedere se funziona.
 
Ciao,
questa cache non l'ho messa su una pagina statica, ma bensi nelle pagine dinamiche del sito, proprio perchè era fatta per quello.
Ho provato con un tool che testa la cache e non mi dava nessuna cache :(

Per il resto non mi da errori quindi proverò a fare un ping come dici tu

grazie mille
 
Potresti provare a sfruttare il sistema di caching di un qualche templare engine. .. Smarty, twig etc. ....
Smarty->cachetime=300;
Sarebbe una cache di 5 minuti....
 

Discussioni simili