Beskriuwing
Yac keeps the cache in a shared memory segment accessible to all PHP workers, so a read is a hash lookup in local memory — no cache server, no socket, no network.
Highlights
- Fast. No socket, no network, no global lock, so throughput scales with workers. Yac’s own benchmark measured 13x-70x higher ops/s than APCu and 170x-730x higher than local Memcached, depending on value size. On the author’s own site (www.laruence.com) that translated to page renders coming out 19% faster than with the Memcached drop-in.
- Nothing to operate. No cache server to install, secure, monitor or restart.
- Health you can read. Hit rate, hits and misses charted over Today / Yesterday / Last 7 days, with a diagnosis that also says when not to add memory.
- Fails soft. No extension, or
yac.enable=0, degrades to a per-request cache and the site keeps serving.
Best fit
Single-node or few-node installs where all PHP workers share a machine. For multi-server clusters needing cross-node consistency, a network cache (Memcached/Redis) suits better.
Skermôfbyldings




Ynstallaasje
Install the Yac extension, any of three ways (then enable
PECLextension=yac.soin php.ini):pecl install yac
PIE (the PHP Foundation’s PECL successor; yac is on Packagist)pie install laruence/yac
Or from source: download the latest release, unzip it, then inside:
phpize && ./configure && make && make install
- Install and activate Yac Object Cache. Activation deploys
wp-content/object-cache.php.
That is it — no wp-config edit needed. Visit Tools Yac Object Cache to verify status.
Optional php.ini tuning
yac.enable = 1
yac.keys_memory_size = 16M ; ~128K slots (~32K per 4M)
yac.values_memory_size = 64M ; raise for large sites (big alloptions)
Optional wp-config switches
define( 'YAC_OCACHE_KEY_PREFIX', 'ab' ); // default wp; give each install its own when sites share one PHP pool
define( 'YAC_OCACHE_EMPTY_TTL', 0 ); // default 21600s: lifetime cap on empty negative results; 0 disables
define( 'YAC_OCACHE_DISABLE', true ); // escape hatch: force runtime-only mode
FAQ
-
Do I need a Memcached or Redis server?
-
No. That is the point — the cache lives in shared memory on the machine.
-
What happens if the Yac extension is not installed?
-
The drop-in degrades to a per-request cache: the site keeps working, you lose cross-request persistence, and the status page flags the missing extension.
-
How are keys stored, given Yac’s 48-byte key limit?
-
As
<YAC_OCACHE_KEY_PREFIX>:<group>:<key>(default prefixwp), verbatim while they fit the 48-byte budget; over-long keys keep the group verbatim and hash (crc32b) only the key part. -
Does flush() clear other Yac users on the same machine?
-
Yes.
wp_cache_flush()callsYac::flush(), which wipes the entire shared memory on the machine, including data written by other Yac users sharing the PHP pool. The admin page asks for confirmation first. -
Multisite?
-
Yes, with a caveat: keys carry no per-blog prefix, so blogs of one install share the namespace and
switch_to_blog()does not re-namespace. Give each install its ownYAC_OCACHE_KEY_PREFIXwhen sites sharing a PHP pool must not see each other’s entries. -
What about wp_cache_flush_group()?
-
Yac cannot delete entries by prefix, so a group flush clears the request-level copy of that group; shared entries then expire via TTL. The plugin reports
flush_groupas unsupported so core does not rely on it.
Resinsjes
Meiwurkers & amp; Untwikkelders
“Yac Object Cache” is iepen boarne software. De folgjende minsken hawwe bydroegen oan dizze plugin.
MeiwurkersOersette “Yac Object Cache” yn jo taal.
Ynteressearre yn ûntwikkeling?
Blêdzje troch de koade , besjoch de SVN-repository , of abonnearje op it ûntwikkelingslogboek troch RSS .
Feroaringslog
1.3.1
- Fixed the admin “Remove drop-in” action always reporting failure.
- Added WP-CLI commands:
wp yac deploy-dropin,wp yac update-dropin,wp yac remove-dropin. - Comment-query cache misses (
WP_Comment_Query::get_comments()wraps an empty result asarray('comment_ids' => array(), 'found_comments' => 0)) are now recognized as negative cache results and capped byYAC_OCACHE_EMPTY_TTLinstead of occupying a slot forever.
1.3.0
- No wp-config edit is needed any more:
WP_CACHEis no longer required or reported. WordPress loadsobject-cache.phpregardless of it — that constant only gatesadvanced-cache.php(page caching), which this plugin does not provide. The live CI run now boots WordPress without it to prove the point. - The Cache health panel became a client-side trend chart: hit rate, hits and misses over Today / Yesterday / Last 7 days, with the window’s counters and the capacity diagnosis on hover. Counters are sampled every 15 minutes into a ~7-day ring.
- Fixed the entry inspector exhausting the PHP memory limit on a busy cache: it now pages through
Yac::dump()instead of accumulating the whole dump. - Fixed the dashboard widget reporting “0 bytes” for values occupied. The Active bar now also shows shared-memory uptime.
- Suggested tuning raised to
yac.keys_memory_size = 16M(~128K slots); 4M gives only ~32K.
1.2.2
- Fixed stale shared-memory writes:
wp_cache_set()on a key already written bywp_cache_add()in the same request skipped the shared write, so other requests kept reading the value the add stored (theupdate_option()pattern left the old option behind). - Replaced
YAC_OCACHE_SKIP_EMPTYwithYAC_OCACHE_EMPTY_TTL(default 21600s): empty results now share as usual but expire instead of occupying a slot forever. - The health panel’s “keys used” reports live entries rather than the
slots_usedhigh-water mark.
1.2.1
- Moved the PHPCS EscapeOutput annotations so WordPress.org Plugin Check recognizes the exemption; annotated
pre_wp_cache_getas a core hook.
1.2.0
- Fixed the health-ring donut disappearing:
wp_kses_post()strips SVG elements. - Renamed every plugin-owned symbol to the
yac_ocache_/YAC_OCACHE_/yac-ocache-prefixes for WordPress.org policy (wp_is reserved for core). Thewp_cache_*functions and$wp_object_cachekeep their standard names; WP-CLI stayswp yac status/wp yac flush.
1.1.1
- A stored
falseis now written as0: Yac’sget()returnsfalsefor both a miss and a storedfalse, so a stored false never survived past the request. - Top entries grew a Hottest tab (by access count) alongside Largest; the entry inspector gained Hits, Embedded-in-slot and
c_len. - Entry listings page through
Yac::dump()instead of onedump(-1), which could exhaust the memory limit.
1.1.0
- Dashboard rebuilt around a cache-health verdict, keys-by-group pie, largest entries, configuration reference and diagnostics.
- Key format rework:
<prefix>:<group>:<key>with no per-blog prefix; over-long keys hash only the key part. YAC_OCACHE_DISABLEescape hatch forces runtime-only mode.
1.0.0
- Initial release. Yac-backed object cache with self-deploying drop-in, verbatim keys with hashed fallback, multisite support, graceful runtime-only fallback, and the admin dashboard.
