Introduction
The mysqlnd query result cache plugin adds easy to use client-side query caching to all PHP MySQL extensions using mysqlnd.
As of version PHP 5.3.3 the MySQL native driver for PHP ( mysqlnd) features an internal plugin C API. C plugins, such as the query cache plugin, can extend the functionality of mysqlnd.
The MySQL native driver for PHP is a C library which ships together with PHP as of PHP 5.3.0. It serves as a drop-in replacement for the MySQL Client Library (AKA libmysql/libmysqlclient). Using mysqlnd has several advantages: no extra downloads because it comes with PHP, PHP license, lower memory consumption in certain cases, new functionality such as asynchronous queries.
Mysqlnd plugins such as the query cache plugin operate transparent from a user perspective. The cache plugin supports all PHP applications and all PHP MySQL extensions ( mysqli, mysql, PDO_MYSQL). It does not change existing APIs.
No significant application changes are required to cache a query. The cache has two operation modes. It will either cache all queries (not recommended) or only those queries marked with a certain SQL hint (recommended).
Key Features
-
Transparent and therefore easy to use
-
supports all PHP MySQL extensions
-
no API changes
-
very little application changes required
-
-
Flexible invalidation strategy
-
Time-to-Live (TTL)
-
user-defined
-
-
Storage with different scope and life-span
-
Default (Hash)
-
MEMCACHE
-
sqlite
-
user-defined
-
Limitations
The query cache plugin prototype will not cache unbuffered queries or results from prepared statements. This limitation is likely to be lifted soon.
The following popular user API calls use buffered queries which can be cached:
-
-
PDO::query() if PDO::ATTR_EMULATE_PREPARES = 1 (default setting)
-
Architecture
The query cache is implemented as a PHP extension. It is written in C and operates under the hood of PHP. During the startup of the PHP interpreter it gets registered as a mysqlnd plugin to replace selected mysqlnd C methods.
At PHP run time it proxies queries send from mysqlnd (PHP) to the MySQL server. If a query string starts with the SQL hint ( /*qc=on*/) to enable caching of it and the query is not cached (cache miss), the query cache plugin will record the raw wire protocol data send from MySQL to PHP to answer the query. The query cache records the wire protocol data in its cache and replays it, if still valid, on a cache hit.
Note that the query cache does not hold decoded result sets consisting of zvals (C struct representing a PHP variable). It stores the raw wire data of the MySQL client server protocol. In case of a cache hits, mysqlnd still needs to decode the cached raw wire data into PHP variables before passing the result to the user space. This approach has one major advantage: simplicity. Furthermore this approach eliminates the need for serializing data for cache storage.