2011-01-27 16 views
8

He oído hablar de dos técnicas de caché para el código PHP:La elección de una técnica de almacenamiento en caché de PHP: caché de resultados en archivos de caché de código de operación vs.

  1. Cuando un script PHP genera una salida lo almacena en archivos locales. Cuando se vuelve a llamar al script, comprueba si el archivo con salida anterior existe y si es verdadero devuelve el contenido de este archivo. Se realiza principalmente con jugar en el "buffer de salida". Algo así se describe en el artículo this.

  2. Utilizando un tipo de complemento de caché de código de operación, donde el código PHP compilado se almacena en la memoria. El más popular de este es APC, también eAccelerator.

Ahora la pregunta es si tiene sentido utilizar ambas técnicas o simplemente usar una de ellas. Creo que el primer método es un poco complicado y consume mucho tiempo en la implementación, cuando el segundo parece ser simple y solo necesitas instalar el módulo.

Uso PHP 5.3 (PHP-FPM) en Ubuntu/Debian.

BTW, ¿hay algún otro método para almacenar en caché código PHP o salida, que no mencioné aquí? ¿Vale la pena considerarlos?

Respuesta

7

Siempre debe tener una memoria caché de código de operación como APC. Su propósito es acelerar el análisis de su código y se incluirá en PHP en una versión futura. Por ahora, es una instalación sencilla en cualquier servidor y no requiere que escriba ni cambie ningún código.

Sin embargo, los códigos de operación de almacenamiento en memoria caché no hacen nada para acelerar la ejecución real de su código. Sus cuellos de botella usualmente se pasan hablando con bases de datos o leyendo desde/hacia el disco. El almacenamiento en caché de la salida de su programa evita el uso innecesario de recursos y puede acelerar las respuestas en órdenes de magnitud.

Puede realizar el almacenamiento en caché de muchas formas diferentes en muchos lugares diferentes a lo largo de su pila. El primer lugar donde puede hacerlo es en su propio código, como sugirió, almacenando en búfer el resultado, escribiéndolo en un archivo y leyendo desde ese archivo en solicitudes posteriores.

Eso requiere ejecutar su código PHP en cada solicitud. Puede almacenar en caché la salida en el nivel del servidor web para omitir eso también. Elaborar un conjunto de reglas mod_rewrite permitirá que Apache sirva los archivos estáticos en lugar del código PHP cuando existan, pero tendrá que regenerar las versiones almacenadas en caché manualmente o con una tarea programada, ya que su código PHP no se ejecutará en cada solicitud para hacerlo.

También puede pegar un proxy en frente de su servidor web y usarlo para almacenar en caché la salida. Varnish es una opción popular en estos días y puede servir cientos de veces más solicitudes por segundo con el almacenamiento en caché que Apache ejecutando su script PHP en el mismo servidor. La caché se crea y configura en el nivel de proxy, por lo que cuando caduque, la solicitud pasará a la secuencia de comandos que se ejecuta como lo haría normalmente para generar la nueva versión de la página.

+0

me están downvoting, pero su información es incorrecta !!!! – Alfred

+0

Has mejorado tu respuesta desde que la rechacé. Cálmese. Y atenúa el fanboy-ismo redis. –

+0

No, no puedo calmarme, me estás degradando (sin razón alguna). Si tuvieras razones válidas para hacerlo, podría entender eso. Pero estoy tratando de ayudar a PHPGuy y todo lo que recibo es downvoted. – Alfred

0

Muchas veces, cuando se trata de aplicaciones web PHP, la base de datos es el cuello de botella. Como tal, una de las mejores cosas que puede hacer es usar memcached para almacenar los resultados en la memoria caché. También puede usar algo como xhprof para crear un perfil de su código, y realmente marcar lo que le está llevando más tiempo.

+0

Si solo tiene una caja, la sobrecarga de la red con memcached es una pérdida en mi opinión. Solo use APC para almacenar sus datos en caché (http://php.net/manual/en/function.apc-add.php). – Alfred

0

Sí, esas son dos técnicas de caché diferentes, y las ha entendido correctamente.

pero cuidado con el 1):

1.) El almacenamiento en caché de la escritura de salida generada a archivos o servidores proxy puede hacer que los problemas si el cambio de contenido rápidamente.

2.) También existe x-cache y es fácil de instalar en ubuntu.

cordiales, /t

0

no sé si esto realmente iba a funcionar, pero me encontré con un problema de rendimiento con un script PHP que tuve. Tengo un archivo de texto sin formato que almacena los datos como un título y una pestaña URL separados con cada registro separado por una nueva línea. Mi secuencia de comandos toma el archivo en cada URL y lo guarda en su propia carpeta.
Luego tengo otra página que realmente muestra los archivos locales (en este caso, imágenes) y uso un preg_replace() para cambiar la salida de cada línea desde la url remota a una relativa para que pueda ser mostrada por el servidor. Mi archivo separado por pestañas ahora es más de 1 MB y se necesitan unos pocos SEGUNDOS para hacer el preg_replace(), así que decidí buscar en el almacenamiento en caché de salida. No pude encontrar nada definitivo, así que pensé en probarlo y esto es lo que se me ocurrió:

Cuando solicito la página para ver cosas localmente, intento leerla desde una variable en un alcance global. Si esto está vacío, es posible que esta aplicación aún no se haya ejecutado y que las necesidades globales se hayan completado. Si estaba vacío, lea de un archivo de salida (archivo html simple que literalmente muestra todo para dar salida) y guarde los contenidos en la variable global y luego muestre el resultado de lo global.
Ahora, cuando la secuencia de comandos se ejecuta para actualizar el archivo separado por pestañas, actualiza el archivo de salida y la variable global. De esta forma, la parte de la secuencia de comandos que realmente hace las cosas que se ejecutan lentamente solo se ejecuta cuando se actualizan los datos.

Ahora no he intentado esto todavía, pero en teoría, esto debería mejorar mucho mi rendimiento, aunque todavía ejecuta el script, pero los datos nunca estarían desactualizados y debería obtener una carga mucho mejor. hora.

Espero que esto ayude.

2

Ya sabes, para mí, optcache, filecache .. etc solo lo uso para reducir las llamadas a la base de datos. No pueden acelerar su código. Sin embargo, mejoran la carga de la página mediante el uso de la memoria caché para atender a sus visitantes.

Conmigo, APC es lo suficientemente bueno para VPS o Servidor Dedicado cuando necesito almacenar widgets, $ object para guardar mi servidor mySQL.

Si tengo más de 2 servidores, me gusta usar Memcache, son buenos para usar la memoria en la memoria caché. Sin embargo, depende de usted, no a todos les gusta memcached, y no a todos, como APC.

Para el almacenamiento en caché de toda la página web, ejecuté un montón de wordpress, y utilicé APC, Memcache, Filecache en algunos complementos de caché como W3Total Cache. Y veo (mi propia exp): Filecache es bueno para almacenar en caché todo el sitio web, la memoria caché es buena para almacenar en caché $ object

Filecache aumentará su CPU si su disco duro es lento, y la memoria caché es terrible si no lo hace t tiene suficiente memoria en su VPS.

Una unidad de disco duro SSD tendrá una velocidad súper buena para leer/escribir archivos, pero la memoria siempre es más rápida. Sin embargo, Human no puede ver cuál es la diferencia entre estas velocidades. ¿Solo escoge una base de método en su proyecto y su servidor (RAM, HDD) o está en un alojamiento web compartido?

Si estoy en un alojamiento compartido, sin permiso de root, sin php.ini, me gusta usar phpFastCache, es un método simple de caché de archivos con set, get, stats, delete only.

Además, me gusta usar .htaccess para almacenar en caché archivos estáticos como imágenes, js, css o encabezados html. Ayudarán a los visitantes a acelerar su página y a guardar el ancho de banda de su servidor.

Y si puede usar .htaccess para redirigir a la memoria caché estática .html si almacena en caché toda la página es una gran cosa.

En el futuro, APC o algún Optcache serán lían en la versión de PHP, pero estoy seguro de todo el caché no puede acelerar su código, que utilizan para:

  1. Reducir base de datos/consulta llama.
  2. Mejore la velocidad de carga de la página utilizando la memoria caché para servir.
  3. Guardar sus transacciones API (como Bing) o solicitud cURL ...

etc ...

Cuestiones relacionadas