Su último sitio web de PHP / MySQL está finalmente en línea. Y es increíble. Pero no es tan rápido como usted quiere, debido a las muchas consultas SQL que se ejecutan cada vez que se genera una página. Y por encima de eso, tiene la sensación de que no se escalará bien bajo cargas pesadas. Y lo más probable es que tengas razón..
En este tutorial, veremos cómo puede mejorar en gran medida la capacidad de respuesta de su sitio web y ayudarlo a escalar para manejar muchos visitantes simultáneos, mediante la implementación de una capa de caché entre su código y su base de datos. La buena noticia es que es bastante fácil y se puede hacer en unos minutos.!
Memcached es un sistema de almacenamiento en caché de datos en memoria de alto rendimiento..
Los sitios web modernos y las aplicaciones web utilizan una gran cantidad de datos, y no es infrecuente contar hasta 20 o incluso 30 consultas SQL en una sola generación de páginas. Multiplique esta cantidad por un gran número de visitantes, y a menudo obtiene una base de datos sobrecargada y páginas que tardan unos segundos en generarse y enviarse al cliente..
La herramienta que vamos a utilizar hoy para mejorar el rendimiento se llama Memcached. Es un sistema de almacenamiento de datos en memoria de alto rendimiento. O para decirlo de otra manera, una aplicación muy rápida que se ejecuta en su servidor y utiliza una fracción de la memoria disponible para almacenar una matriz asociativa de datos. Puedes pedirle a Memcached que haga dos cosas:
V
con la llave K
V
almacenado con la llave K
Esto parece minimalista, pero hay muchas cosas que puedes hacer gracias a estas dos características, como veremos muy pronto. De hecho, Memcached puede hacer algunas cosas más, pero todas están relacionadas con el almacenamiento o la recuperación de datos..
Instalar Memcached en las distribuciones modernas de Linux es bastante simple:
sudo apt-get install memcached
sudo emerge instalar memcached
sudo yum instalar memcached
Una vez instalado, Memcached se iniciará automáticamente cada vez que su servidor arranque. Puede configurar la cantidad de memoria reservada para Memcached, junto con otras opciones, en el archivo de configuración (/etc/memcached.conf
). 64Mb se asigna por defecto. El archivo de configuración también contiene la dirección IP y el puerto al que se conectará Memcached. Valores predeterminados (127.0.0.1
y 11211
) están bien para una configuración estándar.
Queremos almacenar y recuperar datos de sus scripts PHP. Esto significa que vamos a necesitar una forma de conectarse a Memcached desde PHP. Para eso, vamos a instalar la extensión "Memcache" para PHP. Como es una extensión PECL, es muy fácil de instalar con el "pecl" escribiendo el siguiente comando:
sudo pecl instalar memcache
Hay dos extensiones de PHP relacionadas con Memcache: "Memcache" y "Memcached" (observe la "d" en la segunda). Ambos son muy similares, pero el primero tiene una huella más pequeña. En este tutorial, usaremos el mechero Memcache. Una vez instalada, esta extensión debería estar habilitada y las funciones relacionadas con Memcache ahora deberían estar disponibles para sus scripts PHP.
Nuestro trabajo aquí se basa en los siguientes supuestos:
También queremos almacenar nuestros datos de una manera que nos permita recuperarlos de manera eficiente..
En general, queremos guardar nuestros datos en un entorno persistente (por ejemplo, nuestra base de datos MySQL). Pero también queremos almacenar nuestros datos de una manera que nos permita recuperarlos de manera eficiente, incluso si el almacenamiento no es persistente. Así que al final, tendremos Dos copias de nuestros datos. : uno almacenado en MySQL y el otro almacenado en Memcache.
Estos son los pasos que debemos seguir para que esto suceda:
INSERTOS
y ACTUALIZACIONES
) se realizará tanto en MySQL como en MemcachedSELECCIONA
) se realizará en Memcached, y volverá a MySQL en caso de errorEn este punto, probablemente vea qué partes de su código necesitan ser modificadas: partes donde escribe datos y partes donde lee datos. Si su código PHP está bien estructurado, debería haber incluido su código de acceso a datos en funciones o, incluso mejor, en clases. Si es así, actualizar su sitio debería ser muy rápido. Si no, puedes tener un poco más de trabajo..
En primer lugar, vamos a crear una conexión a nuestro servidor Memcached. Aquí está el código que debe usar al principio de sus scripts PHP:
// Las constantes de conexión definen ('MEMCACHED_HOST', '127.0.0.1'); define ('MEMCACHED_PORT', '11211'); // Creación de la conexión $ memcache = new Memcache; $ cacheAvailable = $ memcache-> connect (MEMCACHED_HOST, MEMCACHED_PORT);
En este punto, hemos establecido una conexión con nuestro servidor Memcache. Puede haber fallado, pero lo sabemos gracias a la $ caché disponible
variable.
Vamos a sumergirnos en el almacenamiento de datos. Vamos a dar un ejemplo para aclarar las cosas: una tienda en línea. Tenemos un script llamado edit_product.php
cuyo propósito es guardar los datos de un producto en nuestra base de datos. Cada uno de nuestros productos tiene la siguiente información:
En algún momento de nuestra edit_product.php
código, ejecutamos un INSERTAR
o ACTUALIZAR
Consulta SQL cuyo propósito es escribir los datos de este producto en nuestra base de datos MySQL. Podría verse así:
// Hemos validado y saneado nuestros datos // Hemos escapado de todas las funciones de riesgo con mysql_real_escape_string () // Ahora queremos guardarlo en nuestra base de datos $ sql = "INSERTAR LOS productos (id, nombre, descripción, precio) VALUES ( $ id, '$ nombre', '$ descripción', $ precio) "; $ querySuccess = mysql_query ($ sql, $ db);
Como mencioné anteriormente, queremos almacenar nuestros datos tanto en nuestra base de datos MySQL como en nuestro servidor Memcached. Aquí es cómo vamos a proceder:
// Hemos validado y saneado nuestros datos // Hemos escapado de todas las funciones de riesgo con mysql_real_escape_string () // Ahora queremos escribirlos en nuestra base de datos: $ sql = "INSERTAR LOS productos (id, nombre, descripción, precio) VALORES ($ id, '$ nombre', '$ descripción', $ precio) "; $ querySuccess = mysql_query ($ sql, $ db); // Hemos escrito nuestros datos en nuestra base de datos // Ahora almacenemos el nombre, la descripción y el precio del producto en nuestro caché // El método "set" le dice a nuestro servidor Memcached que almacene los datos asociados a una clave específica si ($ querySuccess = == verdadero) // Construimos una clave única que podemos volver a generar más tarde // Usaremos la palabra 'producto' más la identificación de nuestro producto (por ejemplo, "producto_12") $ clave = 'producto_'. $ id; // Almacenamos una matriz asociativa que contiene nuestros datos de producto $ producto = matriz ('id' => $ id, 'nombre' => $ nombre, 'descripción' => $ descripción, 'precio' => $ precio); // Y le pedimos a Memcached que almacene esos datos $ memcache-> set ($ key, $ product);
En este punto, tanto nuestra base de datos como nuestra memoria caché contienen los datos de nuestros productos.
En caso de que nuestro caché no esté disponible, queremos volver a MySQL.
Ahora vamos a recuperar nuestros datos. En el mismo ejemplo, digamos que nuestra tienda en línea tiene un script llamado product.php
que muestra un producto específico. Accediendo a la pagina product.php? id = 12
mostrará el producto cuyo identificador es 12.
En algún momento de nuestra product.php
código, corremos un SELECCIONAR
Consulta SQL cuyo propósito es recuperar los datos de un producto de nuestra base de datos MySQL. Podría verse así:
// Hemos validado y saneado nuestros datos // Hemos escapado de todas las funciones de riesgo con mysql_real_escape_string () // Ahora queremos leer de nuestra base de datos: $ sql = "SELECCIONAR id, nombre, descripción, precio DE productos WHERE id =" . $ id; $ queryResource = mysql_query ($ sql, $ db); $ producto = mysql_fetch_assoc ($ queryResource);
Como dijimos anteriormente, queremos recuperar nuestros datos de nuestro servidor Memcached si es posible, porque es más rápido que obtenerlos desde MySQL. Pero en caso de que no se pueda acceder a nuestro servidor de caché, o si simplemente no almacena los datos que necesitamos, queremos recurrir a MySQL. Aquí es cómo vamos a proceder:
// Inicializar nuestra variable $ product $ product = null; // Primero verificamos que nuestro servidor de caché esté disponible // La variable $ cacheAvailable se inicializó cuando nos conectamos a nuestro servidor de caché si ($ cacheAvailable == true) // Construimos la clave que asociamos a nuestros datos del producto $ key = 'producto_'. $ id; // Ahora obtenemos los datos de nuestro servidor de caché $ product = $ memcache-> get ($ key); // ¿Necesitamos acceder a MySQL? if (! $ product) // En caso de que lo hagamos ... porque nuestra variable $ product sigue siendo nula // Hemos validado y saneado nuestros datos // Hemos escapado de todas las funciones de riesgo con mysql_real_escape_string () // Ahora queremos leer de nuestra base de datos: $ sql = "SELECCIONE id, nombre, descripción, precio DESDE los productos DONDE id =". $ id; $ queryResource = mysql_query ($ sql, $ db); $ producto = mysql_fetch_assoc ($ queryResource);
En este punto, hemos recuperado los datos que necesitábamos. Probablemente se hizo desde nuestro caché, pero podría ser desde MySQL si el caché no se llenó o no se pudo acceder por algún motivo..
Hemos visto cómo se puede usar Memcached para acelerar su sitio web y limitar la carga de su base de datos. Nuestro ejemplo anterior se basó en PHP y MySQL porque estas tecnologías están ampliamente implementadas, pero este principio es universal y funciona de la misma manera con muchas otras tecnologías: C / C ++, Java, Python, Ruby, Perl, .Net, MySQL, Postgres, Erlang, Lua, Lisp, Cold Fusion, Ocaml y io se enumeran junto con PHP en la wiki oficial de Memcached.
Como mencioné brevemente anteriormente, Memcached proporciona más funciones que los métodos de configuración y obtención simples que hemos visto anteriormente. Dos características adicionales útiles son las actualizaciones de incremento / decremento y la capacidad de establecer un tiempo de caducidad para un dato almacenado específico. Ambos están disponibles en PHP, junto con algunos otros, como se puede ver en la documentación de Memcache..
Diviértase implementando esto en sus sitios web, y disfrute de la mejora de -free- performance. Muchas gracias por leer y por favor avíseme si tiene alguna pregunta en los comentarios a continuación..