2010-02-19 11 views
5

me gustaría utilizar el almacenamiento en caché en un par de páginas:PHP: almacenamiento en caché de las páginas con el estado

  1. páginas individuales del blog
  2. index.php

Sin embargo, después de la elaboración de mi sistema, me di cuenta que los encabezados de mis páginas cambian según el estado muy ligeramente (también conocido como "Hola, [email protected]" si has iniciado sesión). Por lo tanto, quiero asegurarme de que no muestre accidentalmente el nombre de usuario incorrecto o envíe un correo electrónico arriba.

Es una lástima que una cosa tan pequeña que NO quisiera almacenar en caché en una página me obligue a no almacenar nada en mi sitio.

¿Cómo puedo evitar esto?

Respuesta

8

Querrá pensar acerca de POR QUÉ quiere hacer el almacenamiento en caché. El almacenamiento en caché es una optimización y, como tal, solo debe hacerse si es necesario.

Si no está seguro de que sea necesario, regrese y haga una investigación para asegurarse. Esto implicará pruebas de rendimiento en hardware de grado de producción en su laboratorio de pruebas.

Una vez que esté seguro de que es necesario, sabrá la mejora que necesita. Puede considerar el almacenamiento en memoria caché de solo PIEZAS de páginas; esto será menos eficiente en la capa de entrada y almacenamiento en caché que el almacenamiento en caché de páginas completas, pero puede quitar más carga del back-end ya que obtendrá una mayor tasa de aciertos de caché.

Considere una página que tiene un elemento personalizado (por ejemplo, Hola Johnnie) y una parte que es costosa de computar pero cambia relativamente poco y es la misma para todos los usuarios, por ejemplo, algunos precios de acciones.

Puede almacenar los precios de las acciones en la parte de la página durante (digamos) 5 minutos y generar la parte personalizada de la página cada vez. De esta forma, no llegará a la parte de atrás de los precios de las acciones y aún podrá mostrar la página correcta a las personas adecuadas. La mayoría de las compañías consideran que generar el front-end es bastante costoso desde el punto de vista informático (pegar HTML juntos es una pérdida de tiempo) pero se puede escalar muy bien, lo que significa que simplemente puede agregar más estaño cuando no sea lo suficientemente rápido. Por otro lado, los servidores back-end pueden hacer mucho más trabajo, pero escalar mucho menos bien, p. bases de datos: no puede simplemente agregar más servidores porque hay problemas de consistencia/sincronización para lidiar con la escalabilidad de los límites.

+0

+1 Si es firme, necesita que algunas partes de la página sean dinámicas, realmente debe evaluar si vale la pena el esfuerzo de almacenar en caché los fragmentos de la página. Con el almacenamiento en memoria caché de fragmentos aumentará un poco su capacidad, pero aún debe invocar el intérprete de PHP para cada solicitud de página, lo que le limitará mucho más allá de lo que puede lograr con el almacenamiento en caché de páginas enteras. –

4

Una posibilidad que he usado un par de veces es:

  • generación de la página y lo almacenan en la memoria caché, que contiene algo así como "Hello, %%PLACEHOLDER_NAME%%" en lugar del nombre real.
  • cuando un usuario carga la página:
    • carga de la página en caché
    • hacer un (rápida)str_replace para sustituir la etiqueta %%PLACEHOLDER_NAME%% por el nombre del usuario
    • enviar la página "parcialmente dinámico" se He creado de esta manera.

Esto significa que usted tendrá que hacer algunas manipulaciones de PHP, y no se puede almacenar en caché la página entera, ni servir como un archivo estático ...

... Pero también significa que casi toda la página estará en caché; no tendrá que hacer ninguna consulta de base de datos, por ejemplo, si el nombre está almacenado en sesión.

(Algunos dirán que es un poco "sucio" - pero funciona muy bien cuando sólo hay una o dos pequeñas porciones que tienen que ser dinámicos, que parece ser el caso, en su situación)


Y si un día comienza a tener "demasiados" de esos marcadores de posición, tendrá que considerar no almacenar en caché la página, pero los datos que se necesitan para generar la página.

Significa que tendrá que recuperar los datos de la memoria caché y pegarlos para generar la página, pero de esta forma, evitará algunas consultas SQL, ya que la mayoría de sus datos se cargarán de la memoria caché

2

puede utilizar parámetros específicos del usuario con el cache_id o Cache_ID_Key utilizado en la mayoría de las bibliotecas de caché por ahí:

ejemplo:

$id = sh1($userMail); 
$cache->save($id); 

Este es un ejemplo mínimo. La idea es "la clave debe incluir información específica del usuario", que es exclusiva de cada usuario.

Espero que entiendas la idea.

+0

esto podría ayudarme a cargar partes específicas de la página ... no es una mala idea – johnnietheblack

1

¿Qué motor de plantillas está utilizando? Smarty? Si es así, entonces podría forzar a no almacenar en caché algunas partes dinámicas de una página web como esta

{nocache} 
Hello {$username} This is your Email {$email} 
{/nocache} 
+0

en realidad hice mi propio esfuerzo para aprender un poco sobre las agallas ... aunque no es una mala idea. pero suena bastante complicado con un beneficio potencialmente pequeño ... ¿verdad? – johnnietheblack

+1

Smarty no es complicado. Es muy fácil de usar y está muy bien documentado. Puedo recomendar a todos los que tienen la necesidad de separar la lógica de aplicación y la lógica de diseño – streetparade

1

¿Dónde quiere almacenar en caché?

¿En su servidor? Es posible que desee ver Smarty.

¿En proxies/clientes? Luego haga que la página html sea almacenable en la memoria caché, reemplace cualquier contenido dinámico con divs vacíos y escriba los valores usando javascript - el javascript podría almacenar cierta información en las cookies y volver al servidor para el resto.

O eche un vistazo al encabezado 'Varies: Cookie' para saber cómo hacer caché orientado a la sesión.

C.

+0

Smarty es genial y se lo puedo recomendar a todos :-) – streetparade

1

Sinceramente, es algo excesivo para lo que quieres, pero ESI trata los problemas que está enfrentando.

Sin embargo, también podría considerar esto: ¿cuánto de su tráfico ha iniciado sesión? Para muchas aplicaciones web, el 90% del tráfico es anónimo y todas las páginas anónimas se procesan de forma idéntica. Simplemente el almacenamiento en caché de páginas anónimas puede brindarle gran parte del beneficio que está buscando, sin mucho trabajo.

Además, considere almacenar en caché cualquier parte pequeña de la página que pueda reutilizarse en varias páginas; por ejemplo, si tiene una nube de etiquetas que se muestra en todas las páginas y necesita 200 ms para generar, guarde esa caché.

1

No almacene en caché toda la página, simplemente guarde en caché la parte que necesita el almacenamiento en caché real (por ejemplo, la parte que le evitará abrir una conexión a la base de datos). Entonces, el resto de la página aún puede ser dinámica y supongo que está almacenando el nombre de usuario en una variable de sesión, por lo que aún puede hacer, p.

echo "Hello ".$_SESSION['username']; 
Cuestiones relacionadas