2012-01-06 9 views
6

Tengo un sitio web que, básicamente, solo muestra cosas sin formularios y post-get. Este sitio web está basado en PHP y alojado en alojamiento compartido. Raramente cambia Me gustaría habilitar el almacenamiento en caché para este sitio web. Su alojamiento compartido por eso es necesario una solución que:Supersimple basado en archivos estáticos (html) php site cache

  • no utiliza Memcached
  • no necesita mover mi sitio web para VPS
  • no lo utilizo de APC u otras cosas

Así que básicamente lo Me gustaría hacer un caché de cada subsitio en HTML y decirle a PHP que obtenga durante 5 minutos la versión en caché HTML del subsitio actual y mostrarla al usuario. Y después de 5 minutos para actualizar el caché.

He estado buscando algo de tiempo en los internets y hay algunos tutoriales y marcos que admiten este tipo de caché rizado.

Pero lo que necesito es solo una buena biblioteca que sea extremadamente fácil de usar.

me imagino que funcione de esta manera:

<? 

if (current_site_cache_is_valid()) 
{ 
    display_cached_version(); 
    die; 
} 

..mywebsite rendering code 

?> 

Tan simple como suena, pero espero que algún buen compañero desarrollador hizo biblioteca de este tipo antes. Entonces, ¿sabe usted que está listo para usar, no requiere mucho tiempo para implementar la solución?

+0

Si puede usar PEAR, PEAR_Cache podría ser todo lo que necesita: http://pear.php.net/package/Cache –

+0

¿Tiene apache + .htaccess? – hakre

+0

posible duplicado de: [¿Cómo implemento un caché HTML para un sitio PHP?] (Http://stackoverflow.com/questions/55223/how-do-i-implement-a-html-cache-for-a- php-site) – hakre

Respuesta

5

Así es como normalmente hago esto, sin embargo, no conozco su diseño de URL ni su diseño de directorio/archivo.

Lo hago con .htaccess y mod_rewrite­Docs.

El servidor web comprueba si existe un archivo HTML en caché y, en caso afirmativo, se entrega. También puedes verificar su edad.

Si es demasiado viejo o si no existe, se inicia el script PHP (s?). Al comienzo de su script, start the output buffer­Docs. Al final de su secuencia de comandos, obtiene el búfer de salida y coloca el contenido en el archivo de caché y luego lo muestra.

El beneficio de esta solución es que apache entregará archivos estáticos en caso de que existan y no hay necesidad de invocar un proceso de PHP. Si lo hace todo dentro de PHP, no tendrá ese beneficio.

Incluso iría un paso más allá y ejecutaría un trabajo cron que elimina los viejos archivos de caché en lugar de hacer una verificación de tiempo dentro del .htaccess. Hecho esto, puede hacer que la reescritura sea menos compleja para preferir un archivo .php.cached en lugar del .php.

+1

¿Y cómo implementarlo? –

+0

@tomaszs: según lo necesite, depende de su url/file/cache-layout. Si está buscando ejemplos, ideas, este artículo me parece bastante revelador: [Mecanismo de caché avanzado que utiliza PHP, C++ y mod_rewrite de Apache] (http://sven.webiny.com/advanced-cache-mechanism-using-php- cpp-and-apache /) - Junto a esto, vea esta pregunta relacionada: [RewriteRule revisando el archivo en la ruta del archivo reescritura existe] (http: // stackoverflow.com/questions/470880/rewriterule-checking-file-in-rewriten-file-path-exists) – hakre

1

Deberías probar skycache. edición: este proyecto parece demasiado frío: cacheme

Otra solución es utilizar auto_prepend_file/auto_append_file.Algo parecido a lo que se describe en este tutorial: Output caching for beginners

+0

skycache parece ser interesante, pero parece que no funciona en modo seguro. ¿Algunas ideas? –

+0

Encontrado esto: https://github.com/tlrobinson/cacheme.php – greut

3

que tienen un algo simple para el almacenamiento en caché de HTML, predicada sobre las siguientes condiciones

  • El usuario es invitado (usuarios conectados tener un conjunto blog_user cookie)
  • la solicitud URI es un GET que no contiene parámetros de la petición
  • una versión HTML caché del archivo existe

a continuación, un .htaccess reintroduce la regla, asignando la solicitud a un archivo en caché. Se supone que cualquier otra cosa es específica del contexto y, por lo tanto, no puede almacenarse en caché. Tenga en cuenta que utilizo la asignación de URI de estilo wikipedia para mi blog para que /article-23 se asigne a /index.php=article-23 cuando no se almacena en caché.

Utilizo un solo archivo de acceso HTML en mi directorio DOCUMENT_ROOT y aquí está el extracto correspondiente. Es la tercera regla de reescritura que hace lo que quieres. Cualquier script que genere O/P almacenable en caché lo envuelve en un par de ob_start()ob_get_clean() y escribe el archivo de caché HTML (aunque todo esto lo maneja mi motor de plantillas). Las actualizaciones también limpian el directorio de caché HTML según sea necesario.

RewriteEngine on 
RewriteBase/

# ... 
# Handle blog index 
RewriteRule ^blog/$         blog/index    [skip=1] 

# If the URI maps to a file that exists then stop. This will kill endless loops 

RewriteCond %{REQUEST_FILENAME}      -f 
RewriteRule ^blog/.*         -      [last] 

# If the request is HTML cacheable (a GET to a specific list, with no query params) 
# the user is not logged on and the HTML cache file exists then use it instead of executing PHP 

RewriteCond %{HTTP_COOKIE}        !blog_user 
RewriteCond %{REQUEST_METHOD}%{QUERY_STRING}   =GET      [nocase] 
RewriteCond %{DOCUMENT_ROOT}/blog/html_cache/$1.html -f 
RewriteRule ^blog/(article-\d+|index|sitemap.xml|search-\w+|rss-[0-9a-z]*)$ \ 
                 blog/html_cache/$1.html [last] 

# Anything else relating to the blog pass to index.php 
RewriteRule blog/(.*)         blog/index.php?page=$1 [qsappend,last] 

Espero que esto ayude. Mi blog describe esto con más detalle. :-)

2

Ha pasado un tiempo desde que me lo pidieron, pero como esto todavía está recopilando resultados de búsqueda, pensé que podría darle una mejor respuesta.

Puede hacer caché estático en PHP sin .htaccess u otro truco. He encontrado esto en http://simonwillison.net/2003/may/5/cachingwithphp/:

<?php 
$cachefile = 'cache/index-cached.html'; 
$cachetime = 5 * 60; 
// Serve from the cache if it is younger than $cachetime 
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) { 
    include($cachefile); 
    echo "<!-- Cached copy, generated ".date('H:i', filemtime($cachefile))." -->\n"; 
    exit; 
} 
ob_start(); // Start the output buffer 

/* The code to dynamically generate the page goes here */ 

// Cache the output to a file 
$fp = fopen($cachefile, 'w'); 
fwrite($fp, ob_get_contents()); 
fclose($fp); 
ob_end_flush(); // Send the output to the browser 
?> 
+1

Esto no es un caché de archivos estáticos, un proceso de PHP todavía está involucrado en cada solicitud que vence el punto completo del almacenamiento en caché de archivos estáticos. – kizzx2

2

sólo para añadir un poco más a la respuesta de nico para que sea más útil para la copia y el uso genérico de la pasta por el ahorro de tiempo de escribir en los nombres cachefile individuales para cada archivo guardado.

original:

$cachefile = 'cache/index-cached.html'; 

modificación:

$cachefile = $_SERVER['DOCUMENT_ROOT'].'/cache/'.pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_FILENAME).'-cached.html'; 

Lo que esto hace es tomar el nombre de archivo de cualquier archivo que se encuentra en, menos la extensión (.php en mi caso), y agrega la etiqueta "-cached.html" y una nueva extensión al archivo almacenado en caché. Probablemente haya formas más eficientes de hacerlo, pero me funciona y espero que les ahorre tiempo y esfuerzo a otros.

Cuestiones relacionadas