{"id":331033,"date":"2026-06-27T02:22:48","date_gmt":"2026-06-27T02:22:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/jabali-wp-cache\/"},"modified":"2026-06-27T02:56:03","modified_gmt":"2026-06-27T02:56:03","slug":"jabali-cache","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/jabali-cache\/","author":6984253,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"Jabali Cache","header_author":"Jabali Panel","header_description":"Redis-backed object cache (and optional full-page cache) tuned for the Jabali hosting panel. Uses the shared panel Redis over a unix socket with per-site key isolation. Works with or without the phpredis extension.","assets_banners_color":"3f4756","last_updated":"2026-06-27 02:56:03","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/jabali-panel.com\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"apunker","date":"2026-06-27 02:56:03"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3587768,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3587768,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3587768,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3587768,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[146,7913,3853,247,45952],"plugin_category":[52,54],"plugin_contributors":[269066],"plugin_business_model":[],"class_list":["post-331033","plugin","type-plugin","status-publish","hentry","plugin_tags-cache","plugin_tags-object-cache","plugin_tags-page-cache","plugin_tags-performance","plugin_tags-redis","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-apunker","plugin_committers-apunker"],"banners":{"banner":"https:\/\/ps.w.org\/jabali-cache\/assets\/banner-772x250.png?rev=3587768","banner_2x":"https:\/\/ps.w.org\/jabali-cache\/assets\/banner-1544x500.png?rev=3587768","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/jabali-cache\/assets\/icon-128x128.png?rev=3587768","icon_2x":"https:\/\/ps.w.org\/jabali-cache\/assets\/icon-256x256.png?rev=3587768","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Jabali Cache makes WordPress fast by keeping its object cache in Redis instead of rebuilding it on every request.<\/strong> WordPress normally throws away its internal cache at the end of each request, so the same expensive database queries run again and again. This plugin makes that cache persistent \u2014 backed by the Redis instance the <a href=\"https:\/\/jabali-panel.com\">Jabali hosting panel<\/a> already runs \u2014 so pages assemble from memory instead of hammering MySQL.<\/p>\n\n<p>It is purpose-built for shared hosting, where many sites share one Redis server. That shapes every design decision: strict per-site isolation, safe behaviour under memory pressure, and a hard rule that a caching layer must <em>never<\/em> take a site down.<\/p>\n\n<h4>Why you might want it<\/h4>\n\n<ul>\n<li><strong>Fewer database queries, faster pages.<\/strong> Options, post meta, terms, user data and transients come from Redis on repeat requests instead of MySQL.<\/li>\n<li><strong>Lighter database load.<\/strong> Especially noticeable on WooCommerce, membership, and query-heavy sites under traffic.<\/li>\n<li><strong>Drop-in.<\/strong> Activate it and WordPress's standard object-cache API (<code>wp_cache_*<\/code>, transients) starts using Redis. No theme or plugin changes.<\/li>\n<\/ul>\n\n<h4>Built for the way Jabali hosts sites<\/h4>\n\n<ul>\n<li><strong>Zero-config on Jabali.<\/strong> Connects to the panel Redis over the unix socket <code>\/run\/redis\/redis.sock<\/code>, logical database 1. Nothing to type \u2014 no host, port, or password.<\/li>\n<li><strong>Strict per-site isolation.<\/strong> Every install gets its own key prefix. Sites share one Redis database but can never read or flush each other's cache. A site's flush only clears that site's keys.<\/li>\n<li><strong>No phpredis required.<\/strong> If the <code>redis<\/code> PHP extension is present it is used automatically; if not (the Jabali default), the plugin falls back to a dependency-free, pure-PHP RESP client over the same socket. Either way it just works.<\/li>\n<li><strong>Safe under memory pressure.<\/strong> The panel Redis runs an <code>allkeys-lru<\/code> policy, so it may evict keys at any time. Every read is best-effort \u2014 an evicted or missing key simply falls through to the database. An eviction is never an error.<\/li>\n<li><strong>Fails safe, always.<\/strong> If Redis is unreachable for any reason, WordPress keeps running with its normal per-request cache. Nothing breaks; caching just stops accelerating until the connection is back. The admin screen tells you exactly what is wrong and how to fix it.<\/li>\n<li><strong>Multisite-aware.<\/strong> On a network, per-blog data is namespaced per site while genuinely global groups (network, site meta) are shared correctly.<\/li>\n<\/ul>\n\n<h4>Object cache vs. page cache<\/h4>\n\n<p>The persistent <strong>object cache<\/strong> is the main event and is on as soon as you activate the plugin.<\/p>\n\n<p>A full <strong>page cache<\/strong> is also included, but it is <strong>off by default<\/strong>. Jabali already serves a faster page cache at the edge via nginx (FastCGI microcache), so turning on the WordPress page cache as well would just cache the same HTML twice. Enable the in-WordPress page cache only on hosts where the nginx one is not available.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>Jabali Cache stores WordPress's own cache data in your Redis server and nowhere else. It does not collect analytics, contact any external service, or send data off your server.<\/p>\n\n<h4>Support<\/h4>\n\n<p>Development happens on GitHub. Found a bug, or have a feature request? Please open an issue:<\/p>\n\n<p><a href=\"https:\/\/github.com\/shukiv\/jabali-panel\/issues\">https:\/\/github.com\/shukiv\/jabali-panel\/issues<\/a><\/p>\n\n<!--section=installation-->\n<h4>On the Jabali panel (recommended)<\/h4>\n\n<ol>\n<li>Install and activate <strong>Jabali Cache<\/strong>. Activation drops in <code>object-cache.php<\/code> automatically.<\/li>\n<li>In the panel, enable caching for the site (Applications \u2192 cache toggle). This provisions the site's Redis socket access.<\/li>\n<li>Visit <strong>Settings \u2192 Jabali Cache<\/strong> and confirm <strong>Redis connection: Connected<\/strong>.<\/li>\n<\/ol>\n\n<h4>On any other host<\/h4>\n\n<ol>\n<li>Upload the <code>jabali-cache<\/code> folder to <code>wp-content\/plugins\/<\/code> (or install the zip from Plugins \u2192 Add New).<\/li>\n<li>Activate <strong>Jabali Cache<\/strong>.<\/li>\n<li>Point it at your Redis server with a few constants in <code>wp-config.php<\/code> (see the FAQ). Over a unix socket or TCP both work.<\/li>\n<li>Check <strong>Settings \u2192 Jabali Cache<\/strong> for a green connection status.<\/li>\n<\/ol>\n\n<p>If the status ever shows <strong>Not reachable<\/strong>, the screen prints the exact prerequisite to fix \u2014 and the site keeps working the whole time as a normal non-persistent cache.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"the%20status%20says%20redis%20is%20%22not%20reachable%22.%20what%20do%20i%20do%3F\"><h3>The status says Redis is \"Not reachable\". What do I do?<\/h3><\/dt>\n<dd><p>On the Jabali panel, socket access is set up when you enable caching for the site (Applications \u2192 cache toggle). If the status still shows Not reachable, re-run that toggle.<\/p>\n\n<p>On a standalone host, the site's PHP-FPM user needs two things for a unix socket:<\/p>\n\n<ol>\n<li><strong>open_basedir<\/strong> must allow the socket's directory \u2014 add <code>\/run\/redis<\/code> (or wherever your socket lives) to the pool's <code>open_basedir<\/code>.<\/li>\n<li><strong>Read\/write access to the socket<\/strong> for the PHP-FPM user.<\/li>\n<\/ol>\n\n<p>Until that is in place the plugin runs as a normal per-request cache and the site is completely unaffected \u2014 caching just isn't persistent yet.<\/p><\/dd>\n<dt id=\"does%20it%20need%20the%20phpredis%20%28pecl%20redis%29%20extension%3F\"><h3>Does it need the phpredis (PECL redis) extension?<\/h3><\/dt>\n<dd><p>No. It auto-detects phpredis and uses it when available; otherwise it uses a built-in pure-PHP client. You get persistent caching either way.<\/p><\/dd>\n<dt id=\"how%20do%20i%20use%20it%20outside%20the%20jabali%20panel%3F\"><h3>How do I use it outside the Jabali panel?<\/h3><\/dt>\n<dd><p>Define overrides in <code>wp-config.php<\/code>. With none of these set, it defaults to the Jabali socket and a per-site prefix.<\/p>\n\n<pre><code>define( 'JABALI_CACHE_SOCKET', '\/path\/to\/redis.sock' ); \u2014 unix socket, or:\ndefine( 'JABALI_CACHE_HOST', '127.0.0.1' );\ndefine( 'JABALI_CACHE_PORT', 6379 );\n<\/code><\/pre>\n\n<p>Optional:\n    define( 'JABALI_CACHE_DB', 1 ); \u2014 logical database number\n    define( 'JABALI_CACHE_PASSWORD', '...' ); \u2014 Redis AUTH password\n    define( 'JABALI_CACHE_PREFIX', 'mysite' ); \u2014 key prefix (auto-derived per site if unset)\n    define( 'JABALI_CACHE_DISABLED', true ); \u2014 force off without deactivating<\/p><\/dd>\n<dt id=\"will%20it%20isolate%20my%20cache%20from%20other%20sites%20on%20the%20same%20server%3F\"><h3>Will it isolate my cache from other sites on the same server?<\/h3><\/dt>\n<dd><p>Yes. Each install uses a unique key prefix, so reads, writes, and flushes are scoped to your site only. One site cannot see or clear another's cache, even though they may share the same Redis database.<\/p><\/dd>\n<dt id=\"is%20it%20safe%20if%20redis%20runs%20out%20of%20memory%3F\"><h3>Is it safe if Redis runs out of memory?<\/h3><\/dt>\n<dd><p>Yes. The expected policy is <code>allkeys-lru<\/code> \u2014 Redis evicts least-recently-used keys when full. Every read in this plugin is best-effort, so an evicted key just rebuilds from the database. There is no error path that can break the site under memory pressure.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20wordpress%20multisite%3F\"><h3>Does it work on WordPress Multisite?<\/h3><\/dt>\n<dd><p>Yes. Per-site cache data is namespaced per blog, while truly global cache groups are shared across the network as WordPress expects.<\/p><\/dd>\n<dt id=\"should%20i%20also%20turn%20on%20the%20page%20cache%3F\"><h3>Should I also turn on the page cache?<\/h3><\/dt>\n<dd><p>Only if your host does not already have one. On Jabali, nginx serves a FastCGI microcache at the edge, which is faster than caching in PHP \u2014 so the WordPress page cache stays off by default to avoid double-caching. Off Jabali, you can enable it from the settings screen.<\/p><\/dd>\n<dt id=\"how%20do%20i%20manage%20it%20from%20wp-cli%3F\"><h3>How do I manage it from WP-CLI?<\/h3><\/dt>\n<dd><p>wp jabali-cache status          # connection, driver, prefix, key count, page-cache state\n    wp jabali-cache flush           # flush this site's object cache\n    wp jabali-cache flush --pages   # also purge page-cache entries\n    wp jabali-cache enable          # enable caching\n    wp jabali-cache disable         # disable caching\n    wp jabali-cache update-dropins  # (re)install the wp-content drop-ins\n    wp jabali-cache remove-dropins  # remove the drop-ins\n    wp jabali-cache diagnose        # full connectivity + environment report<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%20it%3F\"><h3>What happens when I uninstall it?<\/h3><\/dt>\n<dd><p>Deactivating removes the <code>object-cache.php<\/code> drop-in cleanly, so WordPress reverts to its built-in non-persistent cache. Uninstalling removes the plugin's options. Your Redis data is just a cache and is safe to discard.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Persistent Redis object cache with strict per-site key isolation.<\/li>\n<li>Pure-PHP Redis client fallback when the phpredis extension is absent.<\/li>\n<li>Optional full-page cache (off by default; complements the nginx edge cache).<\/li>\n<li>WP-CLI commands: status, flush, enable, disable, update-dropins, remove-dropins, diagnose.<\/li>\n<li>Admin diagnostics screen with live connection status and fix-it guidance.<\/li>\n<li>Multisite-aware namespacing.<\/li>\n<li>Fail-safe: WordPress keeps running normally whenever Redis is unavailable.<\/li>\n<\/ul>","raw_excerpt":"Persistent Redis object cache for WordPress. Zero-config on the Jabali panel, works without the phpredis extension, and always fails safe.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/331033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=331033"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/apunker"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=331033"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=331033"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=331033"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=331033"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=331033"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=331033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}