El complemento de caché de consultas está implementado como una extensión de PHP. Está escrita en C y opera bajo el manto de PHP. Durante el arraque del intérprete de PHP, se registra como un complemento de mysqlnd para reemplazar a los métodos en C de mysqlnd seleccionados. Por lo tanto, se puede cambiar el comportamiento de cualquier extensión de MySQL para PHP (mysqli, PDO_MYSQL, mysql) compilada para usar la biblioteca mysqlnd sin cambiar la API de la extensión. Esto hace que el complemento sea compatible con cada una de las aplicaciones de MySQL para PHP. Ya que las APIs existentes no se cambian, es casi transparente de usar. Por favor, véase la descripción de la API de complementos de mysqlnd para una discusión sobre las ventajas de la arquitectura del complemento y una comparación con soluciones basadas en proxy.
Transparente de usar
En tiempo de ejecución de PHP, PECL/mysqlnd_qc puede representar a consultas enviadas desde PHP (mysqlnd) al servidor MySQL. Luego inspecciona la sentencia para buscar si puede almacenar en caché sus resultados. Si puede, el conjunto de resultados se almacena en caché usando un gestor de almacenamiento, por lo que ejecuciones posteriores de la sentencia se servirán desde la caché por un periodo definido por el usuario. El tiempo de vida (TTL) de una entrada de la caché se puede establecer globalmente o en función de cada sentencia.
Una sentencia será almacena en caché si al complemento se le indica que almacene todas las sentencias globalmente, o si la consulta comienza con la sugerencia SQL (/*qc=on*/). El complemento puede almacenar en caché cualquier consulta emitida invocando a las llamadas apropiadas a la API de cualquier extensión existente de MySQL para PHP.
Almacenamiento flexible: distintos gestores de almacenamiento
Se admiten distintos gestores de almacenamiento para ofrecer diferentes ámbitos para las entradas de la caché. Los diferentes ámbitos tienen en cuenta diferentes grados de compartir las entradas de la caché entre clientes.
default (interno): memoria del proceso, ámbito: proceso, una o más peticiones web dependiendo del modelo de desarrollo de PHP usado
APC: memoria compartida, ámbito: servidor único, múltiples peticiones web
SQLite: memoria o fichero, ámbito: servidor único, múltiples peticiones web
MEMCACHE: memoria principal, ámbito: servidor único o varios, múltiples peticiones web
user (interno): definido por el usuario - cualquiera, ámbito: definido por el usuario - cualquiera
El soporte para los gestores de almacenamiento APC, SQLite y MEMCACHE ha de estar habilitado en tiempo de compilación. Los gestores default y user son internos. Es posible intercambiar entre gestores de almacenamiento compilados en función a cada consulta en tiempo de ejecución. Sin embargo, se recomienda elegir un gestor de almacenamiento y usarlo para todas las entradas de la caché.
Defensa de cierre interna para evitar la sobrecarga
Para evitar situaciones de sobrecarga, el complemento de caché posee un mecanismo de defensa de cierre interna. Si una entrada de la caché expira, muchos cliente que usen las entradas de la caché intentarán refrescar dicha entrada. Durante el refresco, muchos clientes podrían acceder al servidor de bases de datos de forma concurrente. En el peor caso, el servidor de bases de datos se sobrecargará y le llevará cada vez más tiempo refrescar la entradas de la caché, las cuales, de una en una, permiten que más y más clientes intenten refrescar dichas entradas. Para evitar que ocurra esto, el complemento posee un mecanismo de defensa de cierre interna. Si se habilita dicha defensa y el complemento detecta que una entrada de la caché ha expirado, ampliará el tiempo de vida de dicha entrada antes de refrescar las entradas de la caché. De esta manera, otros accesos concurrentes a la entrada de la caché expirada aún los sirve la caché por un cierto tiempo. Los demás accesos concurrentes no desencadenan un refresco concurrente. Lo ideal sería que las entradas de la caché fueran refrescadas por el cliente, el cual ampliaría el periodo de vida de las entradas de la caché antes de que otros clientes intenten refrescar la caché y ocasionar potencialmente una situación de sobrecarga.
Enfoque único para el almacenamiento en caché
PECL/mysqlnd_qc posee un enfoque único para almacenar en caché conjuntos de resultados que es superior al de las soluciones de caché basadas en aplicaciones. Éstas primero introducen un conjunto de resultados en variables de PHP. Luego, dichas variables son serializadas para el almacenamiento en una caché persistente, y luego deserializadas cuando se obtienen. La caché de consultas de mysqlnd almacena los datos sin tratar del protocolo de conexión enviados desde MySQL a PHP en su caché y los reproduce, si aún son válidos, para una búsqueda coincidente en la caché. De esta forma se ahorra un paso extra de serialización ya que todas las soluciones basadas en aplicaciones deben hacerlo. Puede almacenar los datos sin tratar del protocolo de conexión en la caché sin tener que serializarlos primero para una variable de PHP y deserializar dicha variable para almacenarlos de nuevo en la caché.