[ Ver repositorio Git ] El rendimiento a la hora de ejecutar una aplicación web o cargar una página de una manera rápida y liviana, resultan muy importantes a la hora de desarrollar un proyecto, y para todo esto, php dispone de sistemas de cache muy eficaces como es el caso de APC (Alternative PHP Cache).

En php, los scripts son interpretados, esto es, no hay compilación típica como en otros lenguajes como C o Java, de este modo el intérprete php ‘parsea’ el código, lo ‘compila’ en bytecode y lo ejecuta, estos procesos se realizan por cada petición al servidor. Con APC esa ‘compilación’ se realiza una vez y queda guardada esa porción de bytecode en la memoria, de este modo, ahorramos cargas innecesarias en el servidor hasta que se modifique el código fuente.

Hasta la llegada de la versión de php 6, la manera de usar APC es instalando manualmente esta extensión, en php 6 viene integrado por defecto.
Bien, pues para instalar APC, estos son los pasos:

1. Instalar los paquetes
[php]# apt-get install apache2-prefork-dev php5-dev php-pear[/php]
2. Instalamos la extension para php
[php]# pecl install apc[/php]
3. Añadimos al final del fichero php.ini
[php]extension=apc.so[/php]
4. Reiniciamos Apache y nos mostrará algo asi phpinfo()

Vayamos al grano. Usaremos APC integrado en yii framework por medio de la clase CApcCache.

Antes de usar CApcCache, debemos instalarla en el framework de Yii, es muy simple, basta con añadir al fichero de configuración /protected/config/main.php, al vector de ‘components’ y listo.
[php]’cache’ => array(
‘class’ => ‘system.caching.CApcCache’,
),[/php]
Ahora el uso que hagamos con los métodos de caché de yii serán los de APC.

Básicamente el uso que se hace con estos sistemas de cache (en todos el funcionamiento es similar) es el de guardar información en la caché y recuperarla. Para esto tenemos funciones específicas como
getters y setters propios de APC, pero estos serán solo usados por el framework Yii, nosotros solo indicaremos que es lo que queremos hacer, me explico. Para guardar un valor en la caché usaremos Yii::app()->cache->set(‘idCache’, ‘Esto es el contenido’);, internamente este comando buscará que sistema de caché usamos, y una vez encontrado, buscará en su clase el método set correspondiente, en el caso de CApcCache es addValue() y que seteará el valor por medio de funciones nativas de php, en este caso, apc_store(). Mejor veámoslo en un ejemplo práctico.
[php]if ($datos = Yii::app()->cache->get(‘varCache’))
$html = “Contenido sacado de APC caché: ” . $datos;
else {
$html = “Hola mundo, son las ” . date(“H:m:s”);
Yii::app()->cache->set(‘varCache’, $html, 300);
}
$this->render(“index”, array(‘resultado’ => $html));[/php]
Vayamos por partes, la primera linea busca en la caché el contenido identificado como varCache y lo devuelve, retornará falso si no existe o a caducado su información, si tiene contenido se le asigna a una variable que al final será leida. Si entra por el ‘else’ establecerá la variable $html y le asignará un string y esta variable será guardada en la caché del siguiente modo:

Yii::app()->cache->set(‘identificador para la cache’, ‘contenido de la cache’, ‘tiempo en segundos de caducidad’);

Se puede guardar de todo en la caché, así como un vector, el uso es similar que en el caso anterior
[php]for($i = 0; $icache->set($key, “contenido: “.$i, 300);
$vector[] = $key;
}
$html = Yii::app()->cache->mget($vector);[/php]
En este caso para recuperar la información guardada en la caché de un vector, se usará el método mget(), al que le debemos de pasar un vector con los índices que queremos leer.

También disponemos de un método para comprobar la existencia de contenido de caché, al que le debemos de pasar el identificador de su caché, sería algo así
[php]Yii::app()->cache->offsetExists($id);[/php]
Devuelve true o false, si existe o no respectivamente, no devuelve el contenido como en el caso de get(), por lo tanto su uso será para comprobaciones.

Además de guardar vectores, strings o números, APC permite guardar de todo, como un objeto, almacenará su compilación en bytecode y al sacarla será algo menos que procesar por el script, veamos un ejemplo.
[php]Yii::import(‘application.extensions.Miclase.Miclase’);

if (Yii::app()->cache->offsetExists(‘miclase’)){
$instancia = Yii::app()->cache->get(‘miclase’);
$instancia->setHtml(“Objeto creado con cache”);
}else {
$instancia = new Miclase;
$instancia->setHtml();
Yii::app()->cache->set(‘miclase’, $instancia, 300);
}

$html = $instancia->getHtml();[/php]
Por partes, primero importamos una clase para hacer las pruebas, tiene una propiedad y 2 métodos, un setter y un getter. Posteriormente comprobamos si existe en la cache, en una primera ejecución no existirá, así que entrará por el ‘else’, instanciará la clase, seteará y guardará la instancia en la caché. En una segunda ejecución, entrará por el ‘if’, y la caché devolverá la instancia guardada, con todos sus métodos y propiedades listos para usarse. En estos ejemplos tan livianos no tiene mucho sentido, pero en la práctica, cuando disponemos de enormes clases, esto nos ahorrará un consumo de servidor muy considerable y por ende, tiempo de ejecución.

Se puede rizar el rizo aún más y guardar toda una salida de un action en la caché, sorprendentemente fácil.
[php]if ($datos = Yii::app()->cache->get(‘salidaHtml4’))
echo $datos . “Datos de la cache”;
else {
echo $salida = $this->render(“test4”, array(‘sms’=>’refresca para ver la velocidad ahora.’), true);
Yii::app()->cache->set(‘salidaHtml4’, $salida, 300);
}[/php]
El método render dispone de un tercer argumento que dice si se imprime el contenido o se retorna, si ponemos true, lo devolverá y así lo podemos guardar en una variable, y si, también guardarlo en la caché. En este caso, mirad el repositorio y comprobad su ejecución, sorpenderá el tiempo ahorrado.

APC dispone además de métodos de limpieza de caché, así como eliminación de contenidos independientes en la caché.
Yii::app()->cache->flush(), eliminará toda la caché APC, mientrás que con Yii::app()->cache->delete($id), eliminaremos según que identificador se pase.
[php]if(!Yii::app()->cache->flush())
throw new Exception(“No se ha podido vaciar la cache.”);[/php]
CApcCache encripta el identificador de la caché por motivos de seguridad. Podemos ver el contenido de APC en el servidor local y nos mostrará algo así:

¿Y porque APC?, pues porque PHP lo ha elegido como su acelerador oficial, y las pruebas de rendimiento con Yii son mucho más que sorprendentes.
Desde nuestro servidor podemos ver el uso que estamos haciendo de la caché, disponemos de informes completos que nos ayudarán a mejorar el uso que hacemos de él.

18 Replies to “Cache en yii framework, CApcCache”
  1. Hola, buen post, tengo una duda sobre la duracion de la cache, ya que se puede establecer una cantidad de segundos de duracion, en mi caso una hora, pero estas no se borran, sabes si existe alguna forma de borrar cache de dias anteriores dejando las del dia.

    • Pues en teoría con el tercer parámtero del método Yii::app()->cache->set(null,null, time) se indíca la caducidad y ésta se borraría pasado ese tiempo. Aunque puedes hacerte un método para recorrer la caché:
      $cache = apc_cache_info(‘user’);
      CVarDumper::dump($cache[‘cache_list’], 10, true);
      …y con la info de cada una compruebas su fecha y la eliminas según su día Yii::app()->cache(key);
      Espero haberte ayudado, un saludo!

  2. Good way of telling, and pleasant paragraph to take data about my presentation focus,
    which i am going to deliver in academy.

  3. Bienvenida! y gracias!

    He de pronunciar que tu entrada en el internet site me
    ha sido efectivamente útil!
    Termometro de cocina

  4. Excellent website. Lots of helpful information here. I am sending it to a few friends ans also sharing in delicious.

    And certainly, thank you on your effort!

  5. I’m wonderkng which blogging and site-building
    platform you’re running? I’m new to running a
    blog and have been thinking about using the Live journal platform.

    Do you think this is a
    good foundation to start with? I would be very
    grateful if I could ask you some questions through email so
    I can learnn a bit
    more before getting started. When you have some free time, please be sure to contact me at: salvadorhatcher@gmail.com.

    Thanks

  6. Take notice too about the number of times it
    becomes real. They apologized and I got back in my room somewhat
    flustered with the whole ordeal. A lot of people mistake speed
    and quickness, but these are two completely different matters.

  7. With this new technology of 3gp, mobile users can send large
    amount of knowledge using their mobiles. For Beatlemaniacs,
    we imagine this video was pretty funny. You’ll then switch places along with your friends do it for just one.

  8. Make sure you have each of the right information in place and be sure to have had an independent appraisal done on the exact property.
    One reason for your slowing in the commercial real-estate market can be a concern that there is
    not going to be enough capital for all those aiming to refinance in 2012.

    In Sydney, Australia, a lot of private firms are checking out fitouts, a procedure by Office Fitout Sydney that gives the most
    recent technology and innovative construction methods to create
    and provide its projects and install the plans with a reduced price.

  9. I came across your website accidentally and just just want to say that you have some
    amazing articles here.You need to receive far more visitors so I
    will advise you to try some SEO services.If you’re not
    aware of it or how it works,simply go to http://bit.ly/1xsyLiZ.

  10. I do not even understand how I finished up here, however I believed this publish
    was good. I do not realize who you might be however certainly you are going to a famous blogger if you aren’t already.
    Cheers!

  11. This paragraph is truly a good one it helps new internet users, who
    are wishing in favor of blogging.

  12. Magnificent website. A lot of useful info here. I’m sending it to some
    pals ans also sharing in delicious. And of course, thanks in your sweat!

  13. The web designer can make some suggestion, but the final choice depends on you.

  14. If you are looking for finest Calgary web plans, comparing web rate
    plans and make an knowledgeable choice on which provider to choose.

  15. If some one wants to be updated with newest technologies therefore he must be visit this website and be up to date
    daily.

Deja un comentario

*