2008-10-01 12 views
5

Quiero poner en práctica un sistema de caché de dos pasos:La creación de un sistema de caché de PHP de dos pasadas con los objetos mutables

  • El primer paso genera un archivo PHP, con todas las cosas comunes (por ejemplo, noticias), codificado La base de datos tiene una tabla de caché para vincular estos con las páginas (por ejemplo, "index.php page = 1 style = default"), la base de datos también almacena un campo uptodate, que si es falso causa que el primer pase vuelva a ejecutar la próxima vez que la página es visto.

  • El segundo pase rellena los detalles menores, como por ejemplo, hace cuánto algo (?) Y elementos mutables como "Ha iniciado sesión como ...".

Sin embargo no estoy seguro sobre una aplicación eficiente, que soporta tanto (por ejemplo, búsqueda) páginas en caché y no en caché, sin un montón de código y varias consultas.

Ahora, cada vez que se carga la página, se ejecuta el script PHP regenerando la página. Para páginas como la búsqueda, esto está bien, porque la mayoría de las búsquedas son diferentes, pero para otras páginas, como el índice, esto es prácticamente lo mismo para cada hit, pero genera una gran cantidad de consultas y es un script bastante extenso.

El problema es que algunas partes de la página cambian según el usuario, como la sección "Usted ha iniciado sesión como ...", por lo que el simple hecho de guardar las páginas generadas generaría 10.000 de páginas casi idénticas.

La principal preocupación es reducir la carga en el servidor, ya que estoy en alojamiento compartido y en este momento no puedo permitirme actualizar, pero el sitio está usando una porción considerable de los servidores CPU + poniendo una feria cargar en el servidor MySQL

Básicamente, minimizar la cantidad de solicitudes por página y no regenerar elementos como las noticias en el índice parece ser un buen comienzo, en comparación con la búsqueda que es una página mucho menos estática.

Realmente consideré codificar las noticias como HTML, pero eso significa mantenerlas en varios lugares (ya que pueden usarse para búsquedas y los comentarios están en una página dedicada a esa noticia (es decir, news.php)), etc.).

Respuesta

6

I segundo Ken's rec de la biblioteca de PEAR Cache_Lite, puede usarlo para almacenar fácilmente en caché partes de páginas o páginas enteras.

Si está ejecutando su propio servidor (s), recomiendo encarecidamente memcached en su lugar. Es mucho más rápido, ya que se ejecuta por completo en la memoria y muchos sitios de gran volumen lo utilizan de manera exhaustiva. Es un daemon muy fácil, estable y sin problemas para ejecutar.En términos de su código PHP, lo usaría de la misma manera que Cache_Lite, para almacenar en caché varias secciones de página o páginas completas (u otras manchas arbitrarias de datos), y es muy fácil de usar ya que PHP tiene un memcache interface built in.

Para el almacenamiento en caché de páginas completas de super alto tráfico, eche un vistazo a Varnish o Squid como servidor proxy inverso de almacenamiento en caché. (Las páginas que son servidas por Varnish van a salir fácilmente 100 veces más rápido que cualquier otra que llegue al intérprete de PHP).

Tenga en cuenta que con el almacenamiento en caché, solo necesita almacenar en caché los elementos a los que se accede con frecuencia. A veces puede ser una trampa desarrollar una estrategia de almacenamiento en caché realmente sofisticada cuando realmente no la necesita. Para una página como su página de inicio que se golpea varias veces por segundo, definitivamente desea optimizarla para obtener mayor velocidad; para una página que recibe tal vez unos pocos hits por hora, como una publicación de blog de un mes de antigüedad, es una mala idea guardarla en la memoria caché, solo desperdicia su tiempo y hace las cosas más complicadas y propensas a errores.

1

desea guardar los resultados en un archivo de la lógica y el uso como esta para tirar de ellos hacia fuera:

if filename exists 
    include filename 
else 
    generate results 
    render to html (as string) 
    write to file 
    output string or include file 
endif 

Para que quede claro, no necesita dos pases porque se puede guardar partes de la página y deja el resto dinámico.

3

Por el lado del servidor de almacenamiento en caché uso algo así como Cache_Lite (y dejar que otro se preocupe por el bloqueo de archivos, fechas de caducidad, corrupción de archivos)

4

recomiendo a no reinventar la rueda ... hay algunos motores de plantilla que caché de soporte, como Smarty

+0

No veo cómo esto satisface ninguna de mis necesidades, ya que el caché parece estar definido por toda la vida, esto no tiene relevancia en mi sitio yb no permite partes que cambian comúnmente (por ejemplo, nombre de usuario)) para actualizarse para cada solicitud, sin reconstruir toda la página ... –

0

Recomendaría utilizar el mecanismo de caché existente. Dependiendo de lo que realmente necesite, es posible que esté buscando APC, memcached, varias bibliotecas de caché de plantillas ... Es más fácil/más rápido sintonizar código escrito/probado para satisfacer sus necesidades que escribir todo desde cero. (Por lo general, a pesar de que puede haber situaciones en las que no tiene una choisce)

1

Como siempre con este tipo de pregunta, mi respuesta es:

  • ¿Por qué necesita el almacenamiento en caché?
  • ¿Su aplicación consume demasiado IO en su base de datos?
  • ¿Qué métricas has ejecutado?

Estás hablando de agregar un nivel extra de complejidad a tu aplicación, por lo que debes estar seguro de que realmente la necesitas.

En realidad, puede beneficiarse del uso del caché de consultas MySQL incorporado, si la base de datos es el punto de contención en su sistema. La otra opción es usar Memcache.

Cuestiones relacionadas