PSR-6: interfaz de almacenamiento en caché en PHP 7

Los problemas de rendimiento son el tema siempre candente del desarrollo de aplicaciones. Los efectos de las aplicaciones de bajo rendimiento a veces pueden tener un serio impacto financiero. En 2007, Amazon informó un aumento de 100 ms en el tiempo de carga de https://www.amazon.com/ y sus ventas disminuyeron en un 1%. Varios estudios también han demostrado que es probable que casi la mitad de los usuarios abandonen el sitio web si el tiempo de carga de la página es superior a 3 segundos.

Para abordar el problema de rendimiento, buscamos soluciones de almacenamiento en caché.
Tanto los navegadores como los servidores permiten el almacenamiento en caché de varios recursos, como imágenes, páginas web, archivos CSS/JS. A veces, sin embargo, esto no es suficiente, ya que necesitamos poder controlar el almacenamiento en caché de varios otros bits en el nivel de aplicación, como los propios objetos. Tiempo extraordinario, varias bibliotecas implementaron sus propias soluciones de almacenamiento en caché. Esto dificultó a los desarrolladores, ya que necesitaban implementar soluciones de almacenamiento en caché específicas en su código. Esto hizo imposible cambiar fácilmente la implementación de almacenamiento en caché más adelante.
Para resolver estos problemas, el grupo PHP-FIG presentó el estándar PSR-6.
Este estándar define dos interfaces principales, CacheItemPoolInterface y CacheItemInterface, para trabajar con Pool y Items. El grupo representa una colección de elementos en el sistema de almacenamiento en caché. Mientras que, el artículo representa un solo par clave/valor almacenado dentro del grupo. La parte clave actúa como un identificador único, por lo que debe ser inmutable.
El siguiente fragmento de código refleja la definición de PSR-6 CacheItemInterface:

<?php
namespace Psr\Cache;
interface CacheItemInterface
{
public function getKey();
public function get();
public function isHit();
public function set($value);
public function expiresAt($expiration);
public function expiresAfter($time);
}

El siguiente fragmento de código refleja la definición CacheItemPoolInterface del PSR-6:

<?php
namespace Psr\Cache;
interface CacheItemPoolInterface
{
public function getItem($key);
public function getItems(array $keys = array());
public function hasItem($key);
public function clear();
public function deleteItem($key);
public function deleteItems(array $keys);
public function save(CacheItemInterface $item);
public function saveDeferred(CacheItemInterface $item);
public function commit();
}

Las bibliotecas que implementan el estándar PSR-6 deben ser compatibles con los siguientes tipos de datos PHP serializables:

  • Strings
  • Integers
  • Floats
  • Boolean
  • Null
  • Arrays
  • Object

Las estructuras compuestas, como las matrices y los objetos, siempre son complicadas. El estándar dice que las matrices indexadas, asociativas y multidimensionales de profundidad arbitraria deben ser compatibles. Dado que las matrices en PHP no son necesariamente de un solo tipo de datos, en esto debe tener cuidado. Los objetos pueden utilizar la interfaz serializable de PHP, los métodos mágicos __sleep() o __wakeup(), o una funcionalidad de lenguaje similar. Lo importante es que se espera que los datos pasados a las bibliotecas que implementan PSR-6 vuelvan exactamente como se pasaron.
Hay varias implementaciones de caché PSR-6 disponibles a través de Composer, todas las cuales admiten etiquetas. La siguiente es una lista parcial de los más populares:

  • cache/filesystem-adapter: Usando filesystem
  • cache/array-adapter: Usando PHP array
  • cache/memcached-adapter: Usando Memcached
  • cache/redis-adapter: Usando Redis
  • cache/predis-adapter: Usando Redis (Predis)
  • cache/void-adapter: Usando Void
  • cache/apcu-adapter: Usando APCu
  • cache/chain-adapter: Usando chain
  • cache/doctrine-adapter: Usando Doctrine

Podemos agregar fácilmente cualquiera de estas bibliotecas de almacenamiento en caché a nuestro proyecto simplemente usando Composer require new/package. El cumplimiento de PSR-6 nos permite intercambiar fácilmente estas bibliotecas en nuestro proyecto sin cambiar ninguno de sus códigos.

Redis es un almacén de estructura de datos en memoria de código abierto que se utiliza como base de datos, caché y agente de mensajes. Es bastante popular entre los desarrolladores PHP como una solución de almacenamiento en caché. La página oficial de Redis está disponible en https://redis.io/.
La guía oficial de PSR-6: Interfaz de almacenamiento en caché está disponible en http://www.php-fig.org/psr/psr-6/.


Comparte