Semplice memorizzazione nella cache di PHP con più di 3 parti

In un semplice caching PHP (con ob_start e file), ho bisogno di parti (più o uguale a 3 per pagina) where non caching (contenuto dinamico .PHP o .PHP file context-user based).

+-----------------+ | CACHING CONTENT | | | +-----------------+ | NO CACHING | +-----------------+ | CACHING CONTENT | +-----------------+ | NO CACHING | +-----------------+ | | | CACHING CONTENT | +-----------------+ 

Nelle parti "nessun caching" voglio includere il contenuto dinamico. Posso memorizzare nella cache in tre file cache.html (opzione 1), ma preferisco avere solo un file per pagina cache (invece 3 pagine, opzione 2). Qual è l'opzione migliore per il caching?

  1. Memorizzazione nella cache di diversi file (head_tag.html, body_part1.html, body_part2.html, body_part3.html …) e contenuto dinamico intermedio (files.php).
  2. Memorizzazione nella cache di file univoci, con alcuni tag da sostituire con contenuti dinamici (e … come?)
  3. Altro

NOTA: per favore, nessuna terza soluzione di sistema (memcached, APC …). Ne ho bisogno dall'opzione basata su PHP.

È ansible utilizzare segnaposti per le parti non memorizzate nella cache della pagina e memorizzare nella cache l'intera pagina. Ad esempio, l'intera pagina memorizzata nella cache potrebbe avere il seguente aspetto:

 <html> ... (static content) #DYNAMIC-CONTENT-NAME# ... (static content) #SECOND-DYNAMIC-CONTENT-PLACEHOLDER# ... (static content) </html> 

Quindi in PHP, otterresti semplicemente questa pagina memorizzata nella cache e sostituirai tutti i segnaposto con il contenuto dinamico.

 // obtain the cached page from storage $cached_page = get_cached_page(); // generate the HTML for the dynamic content $dynamic_content = get_dynamic_content(); // replace the placeholders with the actual dynamic content $page = str_replace('#DYNAMIC-CONTENT-NAME#', $dynamic_content, $cached_page); // display the resulting page echo $page; 

In questo modo, puoi posizionare tutti i segnaposti con nome che vuoi, per quanti più contenuti dinamici desideri, quindi li sostituisci semplicemente con il contenuto reale.

Ci sono due modi per farlo con php dritto

Approccio all'intestazione

 $cachetime = 60 * 60 * 24 * 7; // 1 Week header('Expires: '.gmdate('D, d MYH:i:s', time()+$expires).'GMT'); 

Oppure memorizzando nella cache il file completo (con include / contenuto dal contenuto dinamico) nel tuo filesystem (può essere usato per memorizzare nella cache porzioni del sito)

 <?php $cachefile = "cache/".$reqfilename.".html"; #change $reqfilename to $_SERVER['PHP_SELF'] if you are using in headers, footers, menus files $cachetime = 60 * 60 * 24 * 7; // 1 Week // Serve from the cache if it is younger than $cachetime if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) { include($cachefile); exit; } ob_start(); // start the output buffer ?> .. Your usual PHP script and HTML here ... <?php // open the cache file for writing $fp = fopen($cachefile, 'w'); // save the contents of output buffer to the file fwrite($fp, ob_get_contents()); // close the file fclose($fp); // Send the output to the browser ob_end_flush(); ?> 

Quello che puoi fare è anche memorizzare i file nel computer degli utenti usando l'intestazione o aggiornando il tuo htaccess con le informazioni sulla cache. L'implementazione di htaccess potrebbe essere diversa a seconda dei moduli installati sul server di hosting. Io uso:

 # Add Expiration ExpiresActive On ExpiresDefault "access plus 1 week" ExpiresByType text/html "access plus 1 day" ExpiresByType text/php "access plus 1 day" ExpiresByType image/gif "access plus 1 week" ExpiresByType image/jpeg "access plus 1 week" ExpiresByType image/png "access plus 1 week" ExpiresByType text/css "access plus 1 week" ExpiresByType text/javascript "access plus 1 week" ExpiresByType application/x-javascript "access plus 1 week" ExpiresByType image/x-icon "access plus 1 week" ExpiresByType image/ico "access plus 1 week" ExpiresByType text/xml "access plus 1 day"