Docket Cache is a persistent WordPress Object Cache that stores cached data as plain PHP code. It is designed as an alternative for sites that do not have access to Redis or Memcached.
Most file-based caching plugins use
serializing and
unserializing to save PHP objects to flat files. Docket Cache takes a different approach by converting objects into plain PHP code. This makes data retrieval faster and improves overall performance, especially when Zend OPcache is enabled.
For more information, please refer to the documentation on
Caching In WordPress.
Docket Cache requires PHP 7.2.5 or higher, WordPress 5.4 or higher, and Zend OPcache for best performance.
- In your WordPress admin, go to Plugins -> Add New.
- Search for "Docket Cache" and click Install Now.
- Click Activate or Network Activate for Multisite setups.
- Click Docket Cache in the left menu to access the settings page.
Please allow a few seconds for Docket Cache to begin caching objects.
26.04.12
- Added: DOCKET_CACHE_SKIP_UNCHANGED constant and "Skip Unchanged Cache Writes" option to turn it off.
- Fixed: Command::dropino_update() -> Wrong command in the WP-CLI help example.
- Fixed: View::parse_log_query() -> Cache View showed "Data Not available" for every cache file.
- Fixed: Cache Log -> Clicking a row selected a row further down in long logs, and nothing near the end.
- Fixed: Plugin::register_tweaks() -> WordPress Translation Caching looped until a fatal error with WPML String Translation.
- Fixed: Plugin::register_tweaks() -> WordPress Translation Caching gave text domains that were not loaded the translations of another domain.
- Fixed: Filesystem::opcache_compile() -> Cache files rewritten within the same second stayed stale when the host blocks opcache_invalidate() or the write came from WP-CLI.
- Improved: WP_Object_Cache::dc_save() -> Skip writing unchanged values to reduce OPcache wasted memory.
26.04.11
- Fixed: Becache::export_transient() -> Transients were returned as serialized strings instead of their original value.
- Fixed: Becache::export_transient() -> Transient value could be replaced by its timeout, and expired transients were cached.
- Fixed: Becache::store_cache() -> Exported transients now keep their own expiry instead of always using the maximum TTL.
- Fixed: WP_Object_Cache::dc_update() -> Reset the stored type when incr/decr writes a new value.
- Improved: Becache -> Store array and stdClass transients as native PHP, other classes are unserialized on read.
- Improved: WP_Object_Cache -> Bump on-disk cache format version to evict transient cache files written by 26.04.10.
26.04.10
- Fixed: WP_Object_Cache::dc_get()/dc_save() -> Return cached strings exactly as stored to prevent PHP object injection from serialized-looking values.
- Fixed: WP_Object_Cache::dc_get() -> Verify the stored key and group before serving a cached value.
- Fixed: CliOpcache -> Store the WP-CLI OPcache shared secret in a PHP file instead of a web-readable lock file.
- Fixed: Plugin::flush_fcache() -> Validate the cache file index to prevent path traversal.
- Fixed: ReqAction -> Move the Suspend Object Cache state change behind the nonce-verified action.
- Fixed: View::code_focus() -> Build the admin notice via a text node and restrict the option key to prevent DOM-based XSS.
- Fixed: WpConfig::write_runtime() -> Only write expected on/off/integer values into runtime.php.
- Fixed: Crawler -> Only attach cookies to loopback requests, never to the remote Cronbot endpoint.
- Fixed: CronAgent::close_ping() -> Exclude captured cron hook output from the ping response.
- Fixed: EventList -> Escape cron event arguments and callback names in the Cronbot table.
- Fixed: Tweaks -> Cache HTTP responses only for GET requests without Authorization or Cookie, and never cache a response that sets cookies.
- Fixed: MenuCache -> Skip the shared menu cache for logged-in users.
- Improved: WP_Object_Cache -> On-disk cache format version migrates pre-update cache files on read, without a manual flush.
26.04.09
- Added: Cronbot -> Sponsor notice when the service is connected.
- Fixed: nwdcx_cleanuptransient() -> Use prepared statements when removing transients from the database.
- Fixed: Crawler -> Verify SSL certificate on requests to remote endpoints.
- Fixed: ReqAction -> Escape Cronbot error message in admin notice.
- Removed: Critical Version Checking -> No longer needed.
26.04.08
- Fixed: WP_Object_Cache::dc_log() -> Redact query string values in the logged request URI.
- Fixed: Constans -> Default Cache Log file name is no longer predictable.
- Fixed: Filesystem::log_remove_legacy() -> Remove Cache Log files left under the old name.
- Fixed: CronAgent::close_ping() -> Fatal error on rejected ping request.
- Fixed: CronAgent::close_ping() -> Exclude Cookie and Authorization headers from stored ping data.
26.04.07
- Fixed: Polyfill PhpToken stub -> Extend scoped Nawawi\Symfony\Polyfill\Php80\PhpToken.
- Improved: Updated Symfony vendor libraries for PHP 8.4 compatibility.
26.04.06
- Fixed: admin/log.php -> esc_textarea() on Cache Log output to prevent stored XSS.
- Fixed: Plugin::dc_log() -> Sanitise REQUEST_URI caller before logging.
- Fixed: Plugin -> Capability check on log/debug.log downloads reachable unauthenticated on 'init'.
26.04.05
- Fixed: Removed double echo in log.php.
26.04.04
- Added: Configuration UI toggle for WP-CLI OPcache Invalidation (mirrors DOCKET_CACHE_WPCLI_OPCACHE constant).
- Fixed: CliOpcache::notify() -> Buffered per-file notifications at shutdown to prevent HTTP request floods during GC and individual cache unlinks.
- Fixed: CliOpcache -> REST route registered before compat check to eliminate 404 noise when workers bail early under load.
- Fixed: CronAgent::receive_ping() -> Type-safety guard on ping inputs to prevent PHP 8 TypeError from array-form values.
- Fixed: CronAgent::receive_ping() -> Explicit return after close_ping() when CRONBOT is disabled.
- Fixed: CronAgent::receive_ping() -> Multisite loop isolates per-site errors via try/catch; wpcron_error reported so cronbot server detects persistent failures.
- Fixed: CronAgent::run_wpcron() -> Re-entry guard via instance flag and try/finally.
- Fixed: CronAgent::run_wpcron() -> ob_end_clean() on exception path; stop decrementing $run_event below zero.
- Fixed: CronAgent::run_wpcron() -> Pre-init $results and $cron_event to prevent PHP 8 undefined-variable warnings.
- Fixed: CronAgent::run_wpcron() -> REQUEST_URI check uses urldecode() and checks wp_doing_cron() first to avoid URL-encoded bypass.
- Fixed: CronAgent::send_action() -> Cache key includes action to prevent collision between on/off calls from the same IP.
- Improved: CronAgent::send_action() -> $stmp cache-buster refreshes every 5 minutes to avoid CDN staleness in long-running processes.
- Improved: CronAgent::check_connection() -> Skip on AJAX/REST/cron requests to reduce shutdown-hook overhead on high-traffic endpoints.
26.04.03
- Added: CliOpcache — Invalidate web-server OPcache from WP-CLI via REST endpoint.
- Added: DOCKET_CACHE_WPCLI_OPCACHE constant to enable/disable CLI OPcache invalidation.
- Added: DOCKET_CACHE_CONFIGACTION constant to enable/disable Export/Import settings feature.
- Added: Export/Import settings feature for configuration backup and restore.
- Fixed: CliOpcache -> Path traversal protection using realpath() validation.
- Fixed: CliOpcache -> Bulk flush suppression to avoid excessive HTTP requests during full cache flush.
- Fixed: CliOpcache -> Shared secret initialised during REST route registration.
- Fixed: ReqAction -> Flush Object Cache causing 502 nginx error by deferring flush after response.
- Fixed: Plugin::get_opcache_status() -> Filter scripts by ABSPATH to prevent counting other sites on shared hosting.
- Fixed: Plugin::get_opcache_status() -> Removed unnecessary is_file() stale check on every cached script.
- Fixed: OPcache Viewer -> Escaped output of configuration values to prevent XSS.
- Improved: Filesystem::unlink() -> Notify web-server OPcache on individual cache file deletion.
- Improved: Filesystem::cachedir_flush() -> Utilise Crawler class for internal HTTP requests.
- Improved: Plugin::get_opcache_status() -> Skip building scripts array for overview page, cap at 50000 for OPcacheView.
- Improved: Plugin::get_opcache_status() -> Timeout guard for file cache scan on shared hosting.
- Improved: OPcacheView -> Removed "All Items" option, replaced with 50000 items cap.
- Improved: OPcacheView::get_status() -> Cache result to prevent double scan per page load.
Kindly refer to changelog.txt for previous changes.
Please do manually remove wp-content/object-cache.php and wp-content/cache/docket-cache if an error occurs during updates. Thanks.