X

Cómo usar Memcached desde PHP

Memcached es un sistema de cache que se ejecuta en modo servicio y almacena datos en memoria RAM, posee librerías en los diferentes lenguajes de programación y el almacenamiento lo realiza por medio de asociaciones de series de cadenas hash.

 

Cuando se debe utilizar Memcached

 

Memcached se debe utiliza en cualquier aplicación que posea base de datos y realice consultas, ya que nos ayudaria a la velocidad de la aplicación.

 

Como funciona Memcached

 

Memcached funciona almacenando cualquier dato que le solicitemos en memoria ram, el mejor ejemplo para mejorar el rendimiendo de una aplicación es el siguiente:

– Tenemos una tabla en nuestra base de datos y en esta vamos a realizar varias operaciones y veremos como se comporta Memcached.

PHP: Agregamos un registro a la tabla
Php+Memcache: En nuestro Memcached se debe actualizar nuestros nuevos valores
PHP: Consultar los registros de la tabla
Php+Memcache: En vez de ir a nuestra base de datos el php se queda consultando la data que tiene en memcached directamente en la memoria ram osea mucho más rapido.
PHP: Actualizamos un registro en la tabla
Php+Memcache: En nuestro Memcached se debe actualizar nuestros nuevos valores
PHP: Consultar nuevamente los registros de la tabla
Php+Memcache: En vez de ir a nuestra base de datos el php se queda consultando la data que tiene en memcached.
PHP: Borramos un registro en la tabla
Php+Memcache: En nuestro Memcached se debe actualizar nuestros nuevos valores
PHP: Consultar nuevamente los registros de la tabla
Php+Memcache: En vez de ir a nuestra base de datos el php se queda consultando la data que tiene en memcached.

Este seria un proceso básico en Memcached ahora vamos a ver como se puede hacer un ejemplo de Memcached con PHP.

 

Ejemplo Memcached con PHP

 

Funciones para utilizar en nuestro ejemplo

<?php

    global $memcache;
    $memcache = new Memcache;

    function getCache($key) {
        global $memcache;
        return ($memcache) ? $memcache->get($key) : false;
    }

    function setCache($key,$object,$timeout = 60) {
        global $memcache;
        return ($memcache) ? $memcache->set($key,$object,MEMCACHE_COMPRESSED,$timeout) : false;
    }

    function mysql_query_cache($sql,$linkIdentifier = false,$timeout = 60) {
        if (($cache = getCache(md5("mysql_query" . $sql))) !== false) {
            $cache = false;
            $r = ($linkIdentifier !== false) ? mysql_query($sql,$linkIdentifier) : mysql_query($sql);
            if (is_resource($r) && (($rows = mysql_num_rows($r)) !== 0)) {
                for ($i=0;$i<$rows;$i++) {
                    $fields = mysql_num_fields($r);
                    $row = mysql_fetch_array($r);
                    for ($j=0;$j<$fields;$j++) {
                        if ($i === 0) {
                            $columns[$j] = mysql_field_name($r,$j);
                        }
                        $cache[$i][$columns[$j]] = $row[$j];
                    }
                }
                if (!setCache(md5("mysql_query" . $sql),$cache,$timeout)) {
                    # Error en Memcache
                }
            }
        }
        return $cache;
    }
?>

 

Forma de llamar a nuestras funciones php con memcache

<?php
    $sql = "
        SELECT `dataID`, `dataTitle`
        FROM `tbldata`
        WHERE `dataTypeID` BETWEEN 2 AND 2093
        AND `dataStatusID` IN (1,2,3,4)
        AND `dataTitle` LIKE '%something%'
        ORDER BY `dataDate` DESC
        LIMIT 10
    ";

    # Antes: Sin Memcached
    $rSlowQuery = mysql_query($sql);
    # $rSlowQuery is a MySQL resource
    $rows = mysql_num_rows($rSlowQuery);
    for ($i=0;$i<$rows;$i++) {
        $dataID = intval(mysql_result($rSlowQuery,$i,"dataID"));
        $dataTitle = mysql_result($rSlowQuery,$i,"dataTitle");

        echo "<a href=\"/somewhere/$dataID\">$dataTitle</a><br />\n";
    }

    # Despues Con Memcache
    $rSlowQuery = mysql_query_cache($sql);
    # $rSlowQuery is an array
    $rows = count($rSlowQuery);
    for ($i=0;$i<$rows;$i++) {
        $dataID = intval($rSlowQuery[$i]["dataID"]);
        $dataTitle = $rSlowQuery[$i]["dataTitle"];

        echo "<a href=\"/somewhere/$dataID\">$dataTitle</a><br />\n";
    }

?>

Por favor avísanos si hay algún detalle que no esté claro o si tienes alguna duda sobre este procedimiento. Puedes dejarnos un comentario aquí debajo y en breve te daremos una respuesta.

Artículos relacionados