friky.com
← Back to archive

Post

Tutorial de memcache

2009-12-10 Agustí Pons Original post

Memcache es una extensió de PHP que interactua amb memcached, que a la seva vegada es un daemon de cache en memoria, molt simple, que enmagatzema parells key=>value on value pot ser qualsevol cosa serialitzable amb PHP.

Per instal.lar amb Ubuntu farem el següent:
apt-get install memcached
apt-get install php5-memcache

Reiniciar apache:
/etc/init.d/apache2 restart

Es pot fer un php amb un phpinfo(); per veure si hi ha un apartat memcache

Per veure si esta funcionant el memcached (el daemon):
netstat -tap | grep memcached

Per modificar els parametres de memoria etc. editar /etc/memcached.conf

per exemple, per configurar 300Mbs de memoria disponible per variables a memcached modificarem el flag -m del fitxer de configuració:
-m 300

Reiniciar memcached
/etc/init.d/memcached restart

Per consultar les estadistiques en temps real del memcached:

telnet localhost 11211
>stats

Exemple de output:

Trying ::1...Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.statsSTAT pid 4666STAT uptime 153661STAT time 1260523656STAT version 1.2.2STAT pointer_size 64STAT rusage_user 4.850000STAT rusage_system 15.100000STAT curr_items 16001STAT total_items 57971STAT bytes 282532500STAT curr_connections 1STAT total_connections 120074STAT connection_structures 32STAT cmd_get 120016STAT cmd_set 57971STAT get_hits 66178STAT get_misses 53838STAT evictions 0STAT bytes_read 1108602586STAT bytes_written 1317300490STAT limit_maxbytes 314572800STAT threads 1END

Ara només cal modificar el nostre codi per enmagatzemar rows de la base de dades, durant un cert temps, en aquests exemples, creem una clau $action.'/'.$param1.'/'.$param2 o sigui per exemple 'category/23/1' i el valor serà el resultat de la base de dades (una array de rows).

La instrucció set enmagatzema a memcached:

$mc->set($action.'/'.$param1.'/'.$param2, $rows, 1, 3600);

El primer parametre es la clau, el segon el valor, el tercer si volem comprimir el contingut o no i el quart el temps en segons que tindrem el valor al memcache (1 hora)

La següent vegada que haguem de fer la consulta farem el següent:

$rows=$mc->get($action.'/'.$param1.'/'.$param2);

Si ens retorna null, es que no hi es, pero durant una hora, no ens caldrà repetir la consulta.

Exemples de codi:

function get_last($num=16, $offset=1, $flag = 1)  {    $sql = "SELECT v.*       , p.title portal_title         , p.url portal_url         , p.id portal_id     FROM ep_videos v, ep_portals p    WHERE v.portal_id = p.id        AND v.status = 'O'         ORDER BY v.added DESC         LIMIT ".(($offset-1)*$num).", ".$num;    $action='home';    $param1='1';    $param2=$offset;    $mc=new Memcache;    $cr=$mc->connect('localhost', 11211);    if ($cr)    {// tenim memcached      $rows=$mc->get($action.'/'.$param1.'/'.$param2);      if ($rows==null)      {// no el tenim a cache        $rows=parent::get_data($sql);$mc->set($action.'/'.$param1.'/'.$param2, $rows, 1, 3600);      }    }    else    {// no tenim memcached      $rows=parent::get_data($sql);    }          return $rows;      }  function get_last_in_category($id, $num=16, $offset=1)  {      $sql = "SELECT v.*    , p.title portal_title    , p.url portal_url    , p.id portal_id    FROM ep_portals p     , ep_videos v    , ep_categories_videos cv     WHERE cv.video_id = v.id         AND cv.category_id = ".$id."     AND v.status='O'    AND v.portal_id = p.id        ORDER BY v.added DESC         LIMIT ".(($offset-1)*$num).", ".$num;    $action='category';    $param1=$id;    $param2=$offset;    $mc=new Memcache;    $cr=$mc->connect('localhost', 11211);    if ($cr)    {// tenim memcached      $rows=$mc->get($action.'/'.$param1.'/'.$param2);      if ($rows==null)      {// no el tenim a cache        $rows=parent::get_data($sql);$mc->set($action.'/'.$param1.'/'.$param2, $rows, 1, 3600);      }    }    else    {// no tenim memcached      $rows=parent::get_data($sql);    }          return $rows;        //return parent::get_data($sql);  }     function get_last_in_tag($id, $num=16, $offset=1)  {      $sql = "SELECT v.*    , p.title portal_title    , p.url portal_url    , p.id portal_id    FROM ep_portals p     , ep_videos v    , ep_tags_videos cv     WHERE cv.video_id = v.id         AND cv.tag_id = ".$id."     AND v.status='O'    AND v.portal_id=p.id        ORDER BY v.added DESC         LIMIT ".(($offset-1)*$num).", ".$num;    $action='tag';    $param1=$id;    $param2=$offset;    $mc=new Memcache;    $cr=$mc->connect('localhost', 11211);    if ($cr)    {// tenim memcached      $rows=$mc->get($action.'/'.$param1.'/'.$param2);      if ($rows==null)      {// no el tenim a cache        $rows=parent::get_data($sql);$mc->set($action.'/'.$param1.'/'.$param2, $rows, 1, 3600);      }    }    else    {// no tenim memcached      $rows=parent::get_data($sql);    }          return $rows;            //return parent::get_data($sql);  }