Instalar MemCache / Memcached en PHP 7 sobre CentOS 7
By: Date: junio 13, 2016 Categories: Consultoria y Manuales

Memcached o Memcache , Memcached es un servicio de red para almacenado de informacion y tambien una clase en PHP para conectarse a ese servicio, Memcache es una clase de PHP para versiones anteriores a la PHP 7 que se conecta al servicio de Memcached.

En este articulo usare PHP 7 con Memcached como clase sobre el sistema operativo GNU/Linux en su distribucion de CentOS 7

¿ Que es MemCached ?

Es un cache de datos, simplemente almacena datos ya sea el contenido de archivos, datos propios del programador o el usuario y por extension datos de una base de datos por ejemplo una DB SQL

¿ Por que usar MemCached si ya tengo una DB ?

Para obtener los datos una DB tiene que realizar complicadas consultas en las tablas esto hace que el CPU se estrese especialmente cuando las consultas provienen de sitios muy concurridos por que significa que tiene que estar leyendo tablas, encontrando informacion y devolviendo informacion tan rapido como esto sea posible.

Llega un momento en que la DB puede verse superada por el numero de peticiones, esto ocurre cuando el sitio esta bajo un ataque DoS o simplemente por que es un sitio que tiene un trafico legitimo pero muy denso doblegando a la DB hasta que falla.

Memcached no hace consultas complicadas, simpmenete ceaa una equivalencia de lista llave-valor como lo manejan algunos lenguajes de forma nativa. Esto hace posible almacenar consultas de SQL muy repetitivas en una lista con su llave para luego acceder a esa informacion.

En el codigo del pograma tanto de PHP o de cualquier lenguaje que este usando MemChached primero se hace una consulta a MemCached via su llave, si la llave existe entonces se toma la informacion de la llave y no se hace la consulta en la DB. Solo en caso de que la llave no exista se hace la consulta en la DB para poblar memcache con la consulta y evitar volver a hacer la consulta por un tiempo.

¿ Cuanto tiempo existe la informacion en MemCached ?

Por lo general los programadores le ponen 30 segundos, aunque en el metodo de set de memcache se puede pasar el paramentro en segundos de cuanto tiempo se desea que la informacion permanesca viva en la memoria RAM, cuando el tiempo se agota, la informacion es borrada y debe volverse a consultar la DB, ¿ por que ? Por que si no hay un tiempo de expiracion entonces nuevos cambios en la DB nunca serian consultados, asi que de vez en cuando al menos cada 30 segundos si debe consultarse en la DB para poblar memcached con los datos mas actuales de la DB. Esta cantidad de segundos dependera de tipo de informacion a consultar, mientras menos importante sea la informacion mas tiempo se le puede dar incluso varios minutos, todo depender de programador y de la necesidad de que al consultar se obtenga la informacion mas exacta de la DB. Si se tratara de un articulo de wordpress y este actualiza una nota o borra un anota, la nota seguira a pareciendo hasta que llegue el timeout del memcached, la ventaja es que todas las visitas que hayan llegado mientras el dato estaba en memcached recibieron informacion del articulo sin que la DB se estresara por la consulta, de esta manera aunque tenga miles de conexiones simultaneas, la DB se mantiene fresca.

Instalar PHP

yo por lo general compilo mis propios servicios, por lo que debera descargar la version de PHP 7 en su codigo fuente de www.php.net

compilando.

Ejemplo para el configure.


./configure --enable-wddx --enable-zip --with-mysqli --with-gd --with-freetype-dir --with-bz2 --enable-calendar --enable-bcmath --with-zlib --enable-exif --enable-mbstring --enable-soap --with-gnu-ld --prefix=/usr/php7.0.7 --with-curl --with-pdo-mysql --with-openssl –enable-fpm

finalmente make y make install

una vez compilado memcached no es parte de PHP por lo que habra que bajar el codigo fuente desde su repositorio con git


git clone https://github.com/php-memcached-dev/php-memcached.git
cd php-memcached
git checkout php7
phpize
./configure --disable-memcached-sasl
make
make install

Una vez instalado debe existir el modulo para PHP y debe activarse en php.ini con la siguiente linea

extension=memcached.so

En caso de no tener instalado los servicios de memcached en el sistema operativo se pueden instalar rapidamente con:

yum install memcached libmemcached libmemcached-devel

A continuación un código fuente de prueba que hace consultas una DB MySQL, serializa su contenido para poblar memcached y luego consulta memcached para obtener la información.

 

<?php

//Conectar a la DB con Driver MYSQL Base de datos pdotest, Usuario pdo y clave test
try
{
$con = new PDO('mysql:host=localhost;dbname=memcached', 'memcached', 'memcached');
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Soporte de caracteres espanol
$sql = "SET CHARACTER SET utf8;";
$stmt = $con->prepare($sql);
$stmt->execute();

}
catch(PDOException $e)
{
echo 'Error conectando con la base de datos: ' . $e->getMessage();
}

// Conexion a Memcached

$mc = new Memcached();
$mc->addServer("localhost", 11211);

// Creando la varaible de datos
$mcq = array();

// Consulta a primero a MemCahed y si no existe datos a la DB con la llave y variable llamada MCQ
// Para cada consulta se debe usar una llave y una variable diferente, aqui solo es una consulta llamada mcq
// Se hace un get a la llave mcq, si responde falso se hace la consulta a la DB para crear una llave mcq
$mcq = $mc->get("mcq");

if ($mcq === false) {

echo "No se encontro la llave en MemCached , realizando consulta\n";

//Consultas para recuperar valores y almacenamiento en Memcached, por 30 segundos

try {
$sql = "select * from datos;";
$stmt = $con->prepare($sql);
$stmt->execute();

$mcq = $stmt->fetchAll();

$mc->set("mcq", serialize($mcq),30);
}
catch (PDOException $e)
{
echo 'Error conectando con la base de datos: ' . $e->getMessage();
}
}

// Siempre obtenemos los datos de MemCached

$mcq = unserialize($mc->get("mcq"));

foreach ($mcq as $datos)
{
echo $datos["id"]." - ";
echo $datos["nombre"].", ";
echo $datos["edad"]."\n";
}

?>

Deja un comentario

Tu dirección de correo electrónico no será publicada.