1# Changelog
2
3All notable changes to this project will be documented in this file.
4
5## v1.25.3 - 2026-04-08
6### Fixed
7- Fixed Query Monitor 4.x compatibility
8- Disable analytics before uninstalling plugin
9- Prevent rare fatal error in shutdown handler
10- Prevent rare array to string conversion warning
11
12## v1.25.2 - 2026-03-09
13### Added
14- Added `wp redis license` CLI command
15
16### Changed
17- Improved error handling for `CONFIG` and `SLOWLOG` commands
18- Switch to per-interval deltas instead of cumulative totals in "Requests" charts
19- Avoid timeouts by chunking analytics measurements retrieval
20
21### Fixed
22- Fixed chart overlapping in WordPress 7.x
23- Fixed rare uncaught `TypeError` in `Licensing`
24
25## v1.25.1 - 2025-12-02
26### Added
27- Added optional `analytics.persist_limit` configuration option
28
29### Changed
30- Avoid timeouts when flushing with `analytics.persist` enabled
31- Limit analytics persist size `memory_limit / 2` by default
32- Retry failed read commands on primary node before switching Sentinels
33- Consider `*WithMeta()` calls read-only on replicated connections
34
35### Fixed
36- Disable cache if `WP_SETUP_CONFIG` is defined
37- Fixed purging analytics measurements
38- Fixed unit type of Relay "Memory" chart
39
40## v1.25.0 - 2025-10-22
41### Added
42- Added API/CLI endpoints to reset slowlog and command statistics
43
44### Changed
45- Enable `strict` mode by default when a `prefix` is set
46- Prevent integrity flush after cache was reset
47- Removed transient deletion limit of 10k sites
48- Loosen Relay `prefix` health check
49- Replaced `current_time('timestamp')` with `time()`
50- Avoid changing parameter names during inheritance
51
52### Fixed
53- Fixed accessing `CONFIG` on cluster connections
54- Fixed accessing `INFO COMMANDSTATS` on old Redis versions
55- Fixed selecting databases on persistent connections
56- Fixed KeyDB detection
57- Prevent diagnostics warning when `WP_REDIS_DISABLED` is enabled
58- Hardened license health check against API outages
59
60## v1.24.5 - 2025-08-21
61### Fixed
62- Fixed analytics charts not rendering under some conditions
63
64## v1.24.4 - 2025-08-20
65### Added
66- Added `objectcache_analytics_snapshot_measurements` filter
67
68### Changed
69- Increased adaptive cache configuration defaults
70- Support negative `relay.adaptive.events` values
71- Switched all `string` diagnostics to `Diagnostic` objects
72- Use `#[SensitiveParameter]` for strings that may contain passwords
73
74### Fixed
75- Reduce number of measurements fetched for metrics snapshot
76- Fixed `WP_REDIS_DISABLED` not being respected in some places
77- Prevent type error trying to format `null` metric values
78- Prevent rare diagnostics error when not connected
79- Prevent rare error when uninstalling plugin using WP CLI
80
81## v1.24.3 - 2025-07-02
82### Changed
83- Support Relay's new adaptive cache `status` property
84- Support flushing Relay memory on clustered connections
85- Disabled memory usage when scanning groups on clustered connections
86- Improved `SLOWLOG` handling on clustered connections
87- Send sanitized metrics snapshot
88
89### Fixed
90- Prevent error when running cron and using foreign object cache
91- Prevent error when calling `INFO` and using older PhpRedis versions
92- Fixed adaptive cache `events` and `ratio` configuration not taking effect
93- Handle permission errors when running `SLOWLOG|GET` and `MEMORY|USAGE`
94
95## v1.24.2 - 2025-06-20
96### Added
97- Added `wp redis analytics-count` CLI command
98
99### Fixed
100- Prevent excessive analytics snapshots
101
102## v1.24.1 - 2025-06-17
103### Fixed
104- Prevent error when using ElastiCache Serverless instances
105- Prevent `unexpected token` errors when scripts are inlined
106- Prevent event listener registration when adaptive cache widget is missing
107- Switched to ES6 over ES11 syntax
108- Fixed groups scan API call if permalinks are disabled
109- Fixed up some widget padding
110
111## v1.24.0 - 2025-06-14
112### Added
113- Added experimental support for Relay's adaptive cache
114- Added health, slowlog and command statistics widgets
115- Added `queryttl` configuration option (defaults to 24h)
116- Support calculating memory using in groups widget
117- Added `groups`, `slowlog`, `commands` and `prune-queries` CLI command
118- Added `objectcache_flushlog_limit` filter
119
120### Changed
121- Prevent cache from being enabled if handshake fails
122- Be more helpful when connection fails
123- Improved diagnostics and various health checks
124- Store cache analytics as plain JSON
125- Don't store path and hostname in analytics by default
126- Check license gracefully when sleeping for 72+ hours
127- Display latency in milliseconds (not microseconds)
128- Sort results in groups widget
129- Log `getWithMeta()` calls as `GET`
130- Hide `wp_cache_set_last_changed` in Query Monitor stack
131- Deprecated `count` property on `objectcache/v1/groups` endpoint
132- Download cache groups as CSV instead of copying to clipboard
133- Perform integrity flush if WordPress version changes
134- Changed cache command log level from `info` to `debug`
135- Omit logging cache commands in default `ErrorLogLogger`
136- Include `notice` in default log levels
137
138### Fixed
139- Fixed Batcache compatibility issue
140- Fixed Relay client access replicated and clustered connections
141
142## v1.23.1 - 2025-03-17
143### Changed
144- Support disambiguating `false` return values using `$found` (PhpRedis 6.2; Relay 0.10.1)
145- Show integrity flush reason in flush log widget
146- Use unified base REST controller class
147- Support calling `FLUSHDB` without `ASYNC` on Relay connections
148
149### Fixed
150- Fixed undefined array key access
151- Fixed Dragonfly issues with lua scripts
152- Fixed strict types error when using `ZRANGE`
153
154## v1.23.0 - 2025-03-13
155### Added
156- Added server type to diagnostics
157- Added health checks for `KEEPTTL` requirements (Redis 6.0; PhpRedis 5.3)
158
159### Changed
160- Bump required PhpRedis version to 4.0.0
161- Promote `noeviction` health check status to critical
162- Exclude WooCommerce's `wc_cache_*` group from prefetching
163- Retry loading cache metadata with backoff
164- Reduced blocking time when pruning analytics measurements
165- Switch away from deprecated Redis commands
166- Support discarding pipelines and transactions
167- Reduced memory footprint of `Connection::command()`
168
169### Fixed
170- Prevent integrity flush when metadata can't be loaded
171- Preserve key TTL when (de|in)crementing numeric key
172- Fixed resetting log levels when `debug` mode is disabled
173- Prevent rare warnings in `connectToSentinels()`
174- Avoid undefined key notices in `RedisMetrics`
175- Avoid calling invalid calls to `flushBlog()`
176
177## v1.22.0 - 2025-01-23
178### Added
179- Added `full` option for `group_flush` configuration option
180
181### Changed
182- Switch `group_flush` default value to `scan`
183- Swap all `error_log()` call for internal `log()` helper
184- Log all messages when `debug` mode is enabled
185- Improve performance of analytics API requests
186
187### Fixed
188- Fixed rare `TypeError` in `Diagnostics::redisVersion()`
189- Fixed scheme detection for `wp redis cli` command
190- Fixed inverted multi/pipeline modes
191- Fixed OpenTelemetry tracer integration
192- Avoid cloning connection when computing metrics
193
194### Removed
195- Removed deprecated `$RedisCachePro` global
196
197## v1.21.3 - 2024-10-29
198### Changed
199- Allow more cache key separators in Relay prefix health check
200
201### Fixed
202- Fixed changelog not being accessible when `DISALLOW_FILE_MODS` is set
203- Avoid rare notice when using Query Monitor
204- Removed debug call
205
206## v1.21.2 - 2024-07-18
207### Added
208- Support setting `strict` mode using `OBJECTCACHE_STRICT` environment variable
209
210### Changed
211- Don't enable `strict` mode when a `prefix` is set
212
213### Fixed
214- Fixed connection error when no Sentinel replicas are available
215
216## v1.21.1 - 2024-05-21
217### Fixed
218- Fixed rare type mismatch when running admin lifecycle
219
220## v1.21.0 - 2024-05-08
221### Added
222- Added Redis cluster support when using Relay
223- Added `ErrorLogContextLogger` for easier debugging
224
225### Changed
226- Enabled `strict` mode by default
227- Support `WC_SESSION_CACHE_GROUP` constant
228- Use decorrelated jitter backoff algorithm for connection attempts
229- Check `wp_is_file_mod_allowed('object_cache_dropin')` before automatically deleting drop-in
230- Added `Relay*Connection::keysInMemory()` helpers
231- Improved latency widget content when using cluster connection
232- Use configured logger and log levels when logging from plugin itself
233- Resolved PHP 8.4 deprecation notices
234
235### Fixed
236- Avoid rare fatal error in `Configuration::safelyFrom()`
237- Fixed `objectcache_allow_dropin_mod` filter
238
239## v1.20.2 - 2023-10-28
240### Fixed
241- Fixed plugin version string
242
243## v1.20.1 - 2023-10-27
244### Changed
245- Log exception message when cache reset fails
246- Don't run filesystem health check if `DISALLOW_FILE_MODS` is `true`
247- Changed filesystem test file name from `.object-cache-test.tmp` to `object-cache.tmp`
248
249### Fixed
250- Fixed `async_flush` when using PhpRedis v6.0
251- Avoid `TypeError` when using `WP_Error::get_error_data()`
252
253## v1.20.0 - 2023-09-19
254### Added
255- Added cache integrity protection
256- Added analytics charts to dashboard widget
257- Added `objectcache_widget_metrics` filter
258- Added `wp redis reset` command
259- Added support for `OBJECTCACHE_OVERRIDE` and `OBJECTCACHE_MERGE` constants
260- Added support for PhpRedis v6.0
261- Added `analytics.sample_rate` configuration option
262
263### Changed
264- Reduce default `retries` from `5` to `3`
265- Refresh nonce using `X-WP-Nonce` header
266- Expose Relay license issues in Dashboard widget
267- Refactored various flush mechanisms
268- Expanded `ObjectCache::withoutMutations()` callback type from `Closure` to `callable`
269- Delete `objectcache_*` site options when uninstalling
270- Improved license API error handling
271
272### Fixed
273- Fixed failover when using Redis Sentinel
274- Bump `plugins_api` priority to prevent plugins from hijacking responses
275- Mute rare `undefined array key` notice in `flushBacktraceSummary()`
276
277### Removed
278- Removed `split_the_query` filter in favor of native WordPress 6.4 behavior
279- Removed deprecated `rediscache_*` filters
280- Removed deprecated `ObjectCache::flushMemory()` method
281- Removed `objectcache_analytics_retention` filter
282- Removed `--async` option from `wp redis flush`
283
284## v1.19.0 - 2023-07-21
285### Added
286- Added `strict` configuration option
287- Added group flush log widget
288- Added link to settings to dashboard widget
289- Added Relay memory health check
290- Added support for `OBJECTCACHE_PREFER_RELAY` environment variable
291- Added support for `path` and `socket` configuration options
292- Added support for `redis-error.php` template
293- Added `objectcache_cleanup_transients` filter
294- Added `--skip-transients` option to `wp redis enable`
295
296### Changed
297- Render connection exceptions similar to WordPress database errors
298- Throw exception when selecting non-existent database
299- Delete all transients from database after enabling cache
300- Support logging early flushes before plugin code was initialized
301- Improved `WP_Query::get_posts()` performance using `split_the_query`
302- Made Relay diagnostics more helpful
303- Renamed `relay-memory-active` to `relay-memory-used`
304- Not longer recommend disabling `prefetch` and `split_alloptions` when using Relay
305
306### Fixed
307- Display Relay's memory consumption more accurately
308- Improve handling non-fatal `MGET` failures
309- Prevent `wp_cache_init()` initializing twice
310- Avoid rare fatal error when parsing JSON responses
311- Avoid confusing hiredis error message Relay connection times out
312- Avoid fatal error when `gmt_offset` is not valid
313
314## v1.18.2 - 2023-04-04
315### Added
316- Added Query Monitor constants to panel
317
318### Changed
319- Renamed `ms-cache-median` to `ms-cache-avg`
320
321### Fixed
322- Discard transactions if they fail
323- Prevent REST API responses from being cached
324- Fixed measuring analytics writes
325- Fixed `storeWaitAverage` calculation
326- Fixed supported Redis version indicator when using Relay
327
328## v1.18.1 - 2023-03-24
329### Changed
330- Updated End-User License Agreement
331- Don't flush cache when updating drop-in
332
333### Fixed
334- Fixed cache timing metric
335- Fixed widget flush button label on multisite
336- Fixed flushing groups that end with blog id on multisite
337
338## v1.18.0 - 2023-02-20
339### Added
340- Added `wp redis flush-group` CLI command
341
342### Changed
343- Reduced overall memory usage
344- Made cache key generation slightly faster
345- Enable flush logging by default
346- Log `warning` level by default
347- Execute not split `alloptions` reads on primary node
348- Refactored object cache metrics to use new `ObjectCacheMetrics`
349- Enabled flush logging when `save_commands` is set
350- Disabled command logging entirely unless `save_commands` is set
351- Return primary node from `*SentinelsConnection::client()` instead of sentinel client
352
353### Fixed
354- Handle foreign keys without a group in groups REST API endpoint
355- Respect `async_flush` when using `wp_cache_delete()`
356
357### Removed
358- Dropped support for Query Monitor <=3.8.0 backtraces
359- Removed metrics keys from `info()` in favor of `metrics()`
360- Removed `backtrace_summary` logging and deprecated `BacktraceLogger`
361
362## v1.17.1 - 2023-01-28
363### Changed
364- Switched to faster Zstandard compression level
365- Handle non `int|string` cache keys stricter and more gracefully
366- Throw exception for invalid cache keys when `debug` option is enabled
367- Don't let the perflab plugin hijack the object cache drop-in
368- Defer registering `wp redis` CLI command
369
370### Fixed
371- Fixed several multisite blog flushing issues
372- Fixed accessing client on replicated connections
373- Fixed setting `analytics` option to boolean
374- Fixed calling `get_plugin_data()` on non-existent drop-in
375
376## v1.17.0 - 2022-11-23
377### Added
378- Added support replicated and sentinel Relay connections
379- Added `group_flush` configuration option supporting `keys` (new faster default), `scan` (previous default) and `incremental` (enormous datasets)
380- Added `tracer` configuration option supporting `new-relic` and global `open-telemetry` tracer providers
381- Support `network_flush` option when using Redis Cluster
382- Support New Relic tracing for Redis Cluster, Redis Sentinel and Relay clients
383- Added `*Connection::listKeys()` helpers
384- Added `PhpRedisClusterConnection::eval*()` helpers
385- Added Redis Server version health checks and indicators
386
387### Changed
388- Bumped scan and batch removal from `100` to `500` keys
389- Flush more prudently even on main site when using `network_flush`
390- Indicate whether the network or site will be flushed in overview widget in multisite environments
391- Renamed all the things from _master(s)_ to _primary/primaries_ with backwards compatibility
392- Improved must-use plugin detection
393- ⚠️ Added `client()` method to `ConnectionInterface`
394- ⚠️ Use new `ClientInterface` in all `ConnectionInterface` implementations
395- ⚠️ Renamed `Connector` interface to `ConnectorInterface`
396- ⚠️ Renamed `handleBlogFlush()` to `shouldFlushBlog()`
397- Renamed `flush_network` option to `network_flush`
398- Use `ObjectCache::$blogId` instead of `get_current_blog_id()`
399- Use `ObjectCacheCollector::get_storage(): QM_Data` return type
400- Show received bytes _and sent bytes_ in Query Monitor
401- Strip slashes from commands in Query Monitor
402- Improved support for `scan()` and `*scan()` methods
403- Delete FOSS drop-in upon plugin activation
404
405### Fixed
406- Fixed various Redis Sentinel issues
407- Fixed `Invalid regular expression` in Safari
408- Fixed parsing `rawCommand()` in Query Monitor calls when using Redis Cluster
409- Fixed health check for configuration constant being defined too late
410- Fixed attempted property access on null in `Diagnostics::relayHasCache()`
411- Fixed groups widget padding
412- Fixed inverted "Relay Cache" metadata in Query Monitor
413
414### Removed
415- Dropped Twemproxy support
416- Dropped `PhpRedisClusterConnection::scanNode()` helper
417- Dropped `*ObjectCache::Client` constants
418- Dropped `WP_REDIS_PHPREDIS_OPTIONS` constant
419
420## v1.16.4 - 2022-10-31
421### Added
422- Added support for WordPress 6.1's `wp_cache_supports()`
423
424### Changed
425- Refer to "external cache" as "datastore" everywhere
426- Hide `wp_cache_get_last_changed()` and `wp_cache_flush_group()` in Query Monitor
427
428### Fixed
429- Fixed inverted "Relay Cache" diagnostic
430- Fixed rare undefined `OPT_MAX_RETRIES` constant error
431- Don't use WordPress 5.3's `WP_REST_Request::has_param()`
432
433## v1.16.3 - 2022-10-09
434### Added
435- Added new `wp redis status` command
436- Added `objectcache_omit_settings_pointer` filter
437- Added `relay.cache` configuration option
438
439### Changed
440- Improved support for Relay's "client only" mode
441- Renamed `wp redis info` to `wp redis diagnostics`
442- Made `wp redis info` an alias of `wp redis status`
443- Refined hosting provider detection
444- Use new `Connection::$class` property for FQCNs
445
446### Fixed
447- Fixed rare fatal `ValueError`
448
449### Removed
450- Removed no longer needed `Relay::dispatchEvents()` calls
451
452## v1.16.2 - 2022-09-29
453### Added
454- Added support for Relay's "client only" mode
455- Added compatibility with new Query Monitor data classes
456- Added `objectcache_allow_dropin_mod` filter
457- Added `relay.allowed` and `relay.ignored` configuration options
458
459### Changed
460- Append context to `objectcache_*_error` errors
461- Verify `Transaction` result type and count
462- Make it easy to copy all cache groups to the clipboard
463- Refined API health check and diagnostics
464- Refined overview widget
465- Refined analytics charts loading and messages
466- Refined hosting provider detection
467
468### Fixed
469- Avoid executing empty transactions
470- Fixed update channel field availability
471- Fixed Query Monitor request time ratio calculation
472- Fixed rare Query Monitor issue when connection is `null`
473- Hide more update notices when `updates` is `false`
474- Don't inline widget CSS twice
475
476## v1.16.1 - 2022-08-29
477### Fixed
478- Fixed health check condition
479
480## v1.16.0 - 2022-08-22
481### Added
482- Added WordPress 6.1 `wp_cache_flush_group()` support
483- Added REST API endpoint for plugin options
484- Added `objectcache_omit_analytics_footnote` filter
485- Added connection retries
486- Added support for `OBJECTCACHE_CONFIG` environment variable
487- Added integration for WP User Manager
488- Added `withTimeout()` and `withoutTimeout()` connection helpers
489
490### Changed
491- Pass PHPStan L7
492- ⚠️ Made `Plugin`, `Configuration` and `Transaction` classes final
493- ⚠️ Added `MeasuredObjectCacheInterface`
494- ⚠️ Added `commands()`, `memoize()`, `ioWait()` and `withoutMutations()` to `ConnectionInterface`
495- Reduced default (read-)timeout from `5.0s` to `2.5s`
496- Reduced default retry interval from `100ms` to `25ms`
497- Use `retry_interval` configuration option as backoff base
498- Use `read_timeout` configuration option as backoff cap
499- Use option API endpoint to save various settings
500- Append backtrace to invalid cache key type log message
501- Overhauled `flush_runtime()` and `flushRuntime()` methods
502- Default to `default` group in `ObjectCache` helpers
503- Accept any `callable` for `logger` configuration option
504- Catch callback exceptions in `PhpRedisConnection::withoutMutations()`
505- Improved retry/backoff support for Relay connections
506- Support Relay event listeners for WordPress 6.0 `*_multiple()` methods
507- Renamed `default` backoff to `smart`
508- Only calculate cache size when needed and do so more memory-friendly
509
510### Fixed
511- Fixed handling invalid cache keys
512- Fixed loading of settings styles when must-use is symlinked elsewhere
513- Fixed dashboard widget positioning
514- Relaxed URL validation
515- Avoid timeouts when deleting by pattern
516- Avoid rare key identifier collisions
517- Prevent rare analytics restore failure
518- Fixed up `PhpRedisReplicatedConnection` logic for `multi()` and `flushdb()` calls
519- Import missing exception in `Configuration\Concerns\Sentinel` trait
520- Fixed return value of `Updates::setUpPluginInfo()` when error occurred
521- Drop `mixed` type in `PhpRedisClusterConnection::scanNode()`
522- Prevent loading plugin more than once
523- Don't hijack `action` parameter on dashboards
524
525### Removed
526- ⚠️ Removed deprecated `flushRuntimeCache()` helper
527
528## v1.15.2 - 2022-06-30
529### Added
530- Added SQL queries metric
531
532### Fixed
533- Don't require `ext-redis` when running Relay transactions
534- Only hide upgrade notice in must-use setups
535- Tweak widget latency warning color
536- Fixed rare error of `get_num_queries()` not being available
537
538## v1.15.1 - 2022-06-19
539### Added
540- Show basename in diagnostics
541
542### Changed
543- Add Redis and Relay samples to analytics footnote
544- Narrow type hint to `Transaction` in `PhpRedisConnection::executeMulti()`
545
546### Fixed
547- Handle PHP 7.0/7.1 environments gracefully
548- Show error when using bad plugin slug
549- Don't render analytics when not connected
550- Avoid rare undefined index when not connected in Query Monitor
551- Catch all `Throwable` errors in `ObjectCache::error()`, not only exceptions
552
553## v1.15.0 - 2022-06-10
554
555This releases introduces a settings page to keep an eye on cache analytics, manage plugin updates and use diagnostic tools.
556
557### Added
558- Added analytics charts under _Settings > Object Cache_
559- Added plugin updates under _Settings > Object Cache -> Updates_
560- Added various tools under _Settings > Object Cache -> Tools_
561- Added WordPress 6.0's `wp_cache_*_multiple()` and `wp_cache_flush_runtime()` functions
562- Added support for Redis Sentinel
563- Hijack all transactions to allow command logging
564- Added `X-Redirect-By` for all redirects
565- Added `analytics`, `sentinels`, `service` and `relay.invalidations` configuration options
566- Added REST API endpoint for analytics, cache groups and latency
567- Added `master()` and `replicas()` to `PhpRedisReplicatedConnection`
568- Added `nodes()` to `PhpRedisClusterConnection`
569- Added `updates` configuration option
570- Added `wp redis analytics` CLI command that mimics REST API endpoint
571
572### Changed
573- ⚠️ Require PHP 7.2+
574- ⚠️ Require Relay v0.4.0
575- ⚠️ Added `flush_runtime()` to `ObjectCacheInterface`
576- ⚠️ Added `add_multiple()`, `set_multiple()` and `delete_multiple()` to `ObjectCacheInterface`
577- ⚠️ Added `connectToSentinels()` and `connectToReplicatedServers()` `ConnectionInterface`
578- Use group name as hash slot on cluster connections
579- Deprecated `flushMemory()` in favor of `flushRuntime()` for naming consistency
580- Redirect to settings after activation
581- Allow analytics to be restored after cache flushes
582- Only accept integers and non-empty strings as key names
583- Dropped `string` type for `$key` in several `ObjectCacheInterface` methods
584- Hide misleading Relay statistics in `wp redis info`
585- Reverted: Store `alloptions` as individual keys when using Relay
586- Increased Batcache compatibility
587- Disabled `flush_network` option when using Redis cluster
588- Marked PhpRedis v5.3.4 and older as outdated
589- Catch `Throwable` everywhere, not `Exception`
590- Use a single `window.objectcache` object
591- Highlight expensive commands in Query Monitor
592- Be more helpful about missing command logs in Query Monitor
593
594### Fixed
595- Fixed rare error when enabling drop-in
596- Block `wp redis enable` when `WP_REDIS_CONFIG` is not set
597- Fixed instantiating configuration without valid client extension present
598- Avoid fatal error in `CommandsCollector` when no connection is established
599- Show `rawCommand()` calls as actual commands in Query Monitor
600- Various other bug fixes small additions and improvements
601- Fixed selecting non-zero databases in `wp redis cli`
602- Fixed rare rendering issue with `wp redis watch digest`
603- Fixed normalization of IDNs
604- Don't request filesystem write access to check for drop-in existence
605- Fixed rare bug when flushing specific site via `wp redis flush 1337`
606
607### Security
608- Prevent risky plugin auto-updates
609- Prevent plugin upgrades when using version control
610
611## v1.14.5 - 2022-03-22
612### Added
613- Store `alloptions` as individual keys when using Relay
614- Added health check for Relay configuration
615- Added `Plugin::config()` helper method
616
617### Changed
618- Bump Relay requirement to v0.3.0
619- Sped up `ObjectCache::id()` lookups by caching prefix
620- Sped up `alloptions` hash deletion when using `async_flush`
621- ⚠️ Renamed `SplitsAllOptions` trait to `SplitsAllOptionsIntoHash`
622
623### Fixed
624- Fixed support of older Query Monitor versions
625- Added missing `retries` and `backoff` to diagnostics
626- Avoid rare error in `Connection::ioWait()`
627- Avoid rare `TypeError` in `Diagnostics`
628- Avoid rare error in Query Monitor when no connection is present
629
630## v1.14.4 - 2022-02-03
631### Added
632- Introduced `ObjectCache::Client` and `ObjectCache::clientName()`
633
634### Changed
635- Use `QM_VERSION` to detect Query Monitor version
636- Convert logged commands names to uppercase
637- Avoid log spam when calling Relay's `socketId()`, `socketKey()` or `license()`
638- Make `isMustUse()` and `usingVCS()` helpers static
639- Ignore all connection methods in Query Monitor backtraces
640- Use new `qm/component_type/unknown` filter to set component type
641
642### Fixed
643- Avoid warnings when displaying rare commands in Query Monitor
644
645## v1.14.3 - 2021-12-30
646### Added
647- Added file header health checks
648- Use Query Monitor backtraces and components when available
649- Added integrations for several user role editors
650- Detect must-use installations and VCS checkouts
651- Respect `WP_REDIS_UPDATES_DISABLED` constant and environment variable
652- Added `Plugin::Capability` constant
653- Added `Plugin::$directory` variable
654
655### Changed
656- Use `REQUEST_TIME_FLOAT` when available for improved accuracy
657- Improve handling when `WP_REDIS_CONFIG` is set too late
658- Use `current_screen` action to register dashboard widgets
659- Use `wp_add_inline_style()` for widget styles
660
661### Fixed
662- Replaced non-functional capability checks using `map_meta_cap` with `user_has_cap` filter
663- Restored plugin meta links
664- Restored mu-plugin and drop-in update notices
665- Disable update button in must-use setups
666- Corrected value used for total Relay memory
667- Avoid warning in `Diagnostics` when `WP_REDIS_CONFIG` is not set
668
669## v1.14.2 - 2021-12-12
670### Added
671- Added `objectcache_dashboard_widget` filter
672- Added `objectcache_network_dashboard_widget` filter
673- Added `backoff` and `retries` configuration options
674- Added `pre_objectcache_flush` filter to short-circuit the flushing
675- Safeguard against update confusion attacks using `Update URI` plugin header
676- Added `shared` configuration option to show key count instead of database size in shared environment
677
678### Changed
679- Use decorrelated jitter backoff algorithm by default for all connections
680- Append analytics comment to all XML feeds
681- Show license state in Query Monitor and diagnostics
682- Collect Relay key counts in metrics
683- Bump Relay requirement to v0.2.2
684- Memorize `Relay::stats()` calls
685
686### Fixed
687- Several PHP 8.1 compatibility fixes
688
689## v1.14.1 - 2021-10-26
690### Fixed
691- Fixed invalid nonce errors
692
693### Removed
694- Removed unnecessary `phpversion()` and `setOption()` calls in `RelayConnector`
695
696## v1.14.0 - 2021-10-26
697
698⚠️ This release contains minor breaking changes.
699
700### Added
701- ⚠️ Added `Connector::supports()` method
702- ⚠️ Added `ObjectCacheInterface::boot()` method
703- Added Twemproxy support
704- Added `ObjectCache::metrics()` method
705- Added `Connection::ioWait()` method
706- Added `Plugin::flush()` helper
707- Added several `Diagnostic` helper methods
708- Display Relay cache size in dashboard widget
709- Track reads, writes, hits and misses counts
710- Added cluster support to `wp redis cli`
711- Allow clusters to be flushed asynchronously
712- Added backbone for analytics and `wp redis watch` command with 3 watcher types
713- Added environment type and host to all diagnostics
714
715### Changed
716- ⚠️ Changed dashboard widget identifier to `dashboard_objectcache`
717- Deprecated `$GLOBALS['RedisCachePro']`, use to `$GLOBALS['ObjectCachePro']` instead
718- Deprecated `rediscache_manage` capability, use to `objectcache_manage` instead
719- Deprecated `rediscache_validate_dropin` filter, use `objectcache_validate_dropin` instead
720- Deprecated `rediscache_validate_dropin_version` filter, use `objectcache_validate_dropin_version` instead
721- Deprecated `rediscache_check_filesystem` filter, use `objectcache_check_filesystem` instead
722- Trigger `E_USER_WARNING` instead of `E_USER_NOTICE` in `ObjectCache::__get()`
723- Always use asynchronous flushing with Relay
724- Flush the cache when calling `wp redis enable` and `wp redis disable`, unless `--skip-flush` is passed
725- Don't `EXPIRE` the `alloptions` hash map
726- Memorize `PING` and `INFO` results when feasible
727- Register shutdown function to close cache in `wp_cache_init()`
728- Store prefetches when closing cache
729- Only log incompatible key prefetch warnings in `debug` mode
730- Show extended metrics in Query Monitor panel
731- Simplified Debug Bar integration
732- Moved CLI commands into `Console` namespace
733- Boot connector when setting client in the configuration, not in `wp_cache_init()`
734- Improved error messages when checking of compression/serializer in configuration
735- Use SPL autoload function in `bootstrap.php`
736- Increased priority of dashboard widget
737- Set default `timeout` and `read_timeout` to `5` seconds
738- Set default `retry_interval` to `100` milliseconds
739- Always verify invalid licenses when running health checks
740- Bumped the HTTP timeout for license health checks to `15` seconds
741- Invalidate drop-in file opcode when disabling the cache
742- Cache `get_plugin_data()` calls to improve performance
743- Flush the cache when enabling/disabling the drop-in via dashboard widget and when deactivating the plugin
744- Support must-use Query Monitor setups
745- Bumped `prefix` limit to `32` characters
746
747### Fixed
748- Speed up API health check
749- Fixed some rare PHP notices
750- Fixed fatal error when using `url` option without password
751- Prevent unnecessary config calls in `RelayObjectCache`
752- Support `object-cache-pro.php` basename setups
753- Fix PHP 7.1 and older compatibility in `License`
754
755### Removed
756- Removed unnecessary confirm dialogs from dashboard widget action
757
758## v1.13.3 - 2021-06-08
759### Added
760- Support passing function names to `logger` configuration option
761
762### Changed
763- Improved [Relay](https://relaycache.com) integration and support
764- Improved unsupported `compression` and `serializer` error messages
765- Renamed more things to "Object Cache Pro"
766
767### Fixed
768- Support `url` option without usernames
769- Ensure `wp_debug_backtrace_summary()` is loaded to increase Batcache compatibility
770
771### Security
772- Hide passwords in `url` from diagnostics
773
774## v1.13.2 - 2021-04-29
775### Added
776- Added `relay_listeners` configuration option
777- Added a `BacktraceLogger` logger for easy debugging
778- Added wildcard support in non-prefetchable group names
779
780### Changed
781- Split up `setMutationOptions()` methods
782
783### Fixed
784- Fixed flushing clusters when using a TLS connection
785
786## v1.13.1 - 2021-04-14
787### Changed
788- Disable prefetching for CLI and API requests
789- Added `userlogins` and `wc_session_id` to non-prefetchable groups
790- Prevent even more `__PHP_Incomplete_Class` errors when using prefetching
791
792### Fixed
793- Fixed type error in `PrefetchesKeys`
794
795## v1.13.0 - 2021-04-12
796### Added
797- Added support for [Relay](https://relaycache.com)
798- Added `client` configuration option
799- Added `tls_options` configuration option
800- Added `ObjectCache::withoutMutations()` helper
801- Added `PrefetchesKeys::deletePrefetches()` helper
802- Added `info` log lines to `wp_cache_init()`
803- Added wildcard support in non-persistent group names
804- Show command count and argument class names in Query Monitor
805
806### Changed
807- Respect `debug` configuration option in `wp_cache_init()`
808- Added `Connector::boot(): void` interface method
809- Deprecated `WP_REDIS_PHPREDIS_OPTIONS` constant
810- Renamed several internal exceptions
811- Access fully qualified constants
812- Expect `PhpRedisConnection` in `PhpRedisObjectCache` constructor
813- Use high resolution time when available
814- Increased command time decimals from `2` to `4`
815- Refactored license code to be more graceful
816- Prevent `__PHP_Incomplete_Class` errors when using prefetching
817
818### Fixed
819- Fixed flushing networks when using the `site` or `global` option
820- Fixed preloading in multisite environments
821- Fixed prefetches count discrepancies
822
823## v1.12.0 - 2020-12-23
824### Added
825- Improved PHP 8 compatibility
826- Added support for Batcache
827- Support flagging groups as non-prefetchable
828- Added `ObjectCache::deleteFromMemory(string $key, string $group)` method
829- Added `ObjectCache::flushMemory()` in favor of `ObjectCache::flushRuntimeCache()`
830- Added `rediscache_validate_dropin` filter
831- Added `rediscache_validate_dropin_version` filter
832
833### Changed
834- Support loading the object cache as early as `advanced-cache.php`
835- Changed default value of `cluster_failover` to `error` to improve stability
836- Refactored `flushBlog(int $siteId, string $flush_network = null)` method
837- Check `wp_is_file_mod_allowed('object_cache_dropin')` before automatically updating drop-in
838- Marked PHP 7.3 as outdated
839
840### Fixed
841- Prevent another rare undefined variable notice in `wp_cache_init()`
842- Resolve incompatibility with Query Monitor 3.6.5
843- Updated some links to the documentation
844
845## v1.11.1 - 2020-11-12
846### Changed
847- Only preload groups with at least two keys
848
849### Fixed
850- Convert integer group names to strings
851
852## v1.11.0 - 2020-11-11
853### Added
854- Added prefetching 🚀
855- Added `ObjectCache::flushRuntimeCache()` method
856- Added `PhpRedisConnection::withoutMutations()` method
857- Added support for Query Monitor's new backtraces
858
859### Changed
860- Improved memory usage display in widget
861- Speed up command execution when using replication
862- Improved parameter formatting in Query Monitor
863- Attach backtrace as array along with backtrace summary to log messages
864- Moved runtime cache helpers from to `ObjectCache` class
865
866### Fixed
867- Fixed updating split `alloptions` hash options with equivalent values
868- Send `alloptions` hash read commands to the master when using replication
869- Prevent rare undefined variable notice in `wp_cache_init()`
870
871## v1.10.2 - 2020-09-28
872### Added
873- Overload generic `cache_hits` and `cache_misses` properties
874
875### Changed
876- Always return a `Configuration` from `Configuration::safelyFrom()`
877- Use invalid configuration option name (not method name) in error log message
878
879### Fixed
880- Use key caching in multisite environments
881- Added suffix to MU and Drop-in stubs to avoid invalid plugin header error when activating
882
883## v1.10.1 - 2020-09-16
884### Fixed
885- Fixed an issue with non-persistent, numeric keys in `get_multiple()`
886
887## v1.10.0 - 2020-09-15
888### Added
889- Show connection class in Query Monitor
890- Added `Configuration::parseUrl()` helper
891- Added support for replicated connections
892- Show configuration instantiation errors in widget and site health
893
894### Changed
895- Moved `RedisCachePro\Config` class to `RedisCachePro\Configuration\Configuration`
896- Renamed `slave_failover` configuration option to `cluster_failover` ✊🏿
897- Extracted cluster related configuration into `RedisCachePro\Configuration\Concerns\Cluster`
898- Trim log messages to 400 characters in Debug Bar log
899- Throw `RedisConfigValueException` for invalid configuration values instead of `RedisConfigException`
900
901### Fixed
902- Create a proper configuration object when cache instantiation fails
903- Escape command parameters in Query Monitor extension
904- Moved Redis related information from `ObjectCache::info()` to `PhpRedisObjectCache::info()`
905- Always strip `unix://` from PhpRedis host parameter
906- Ensure `PhpRedisObjectCache::info()->status` returns a boolean
907- Prevent invalid configuration values from booting plugin
908
909## v1.9.2 - 2020-08-29
910### Added
911- Look for `object-cache-pro` directory in must-use stub
912
913### Fixed
914- Fixed host scheme in PhpRedis 5.0.2 and older
915
916## v1.9.1 - 2020-08-26
917### Added
918- Added `wp_cache_remember()` and `wp_cache_sear()` functions
919
920### Changed
921- Pointed all URLs to the new domain `objectcache.pro`
922- Change log prefix from `rediscache` to `objectcache`
923- Slightly sped up API loading in object cache drop-in
924
925### Fixed
926- Only throw exception in mu-plugin and drop-in when `WP_DEBUG` is true
927
928## v1.9.0 - 2020-08-15
929### Added
930- Added `url` configuration option
931- Added `scheme` configuration option
932- Added support for `options` parameter added in PhpRedis 5.3
933- Added support for LZ4 compression (PhpRedis 5.3+)
934
935### Changed
936- Support connecting to sockets and using TLS in `wp redis cli`
937- Convert `host` configuration option to lowercase
938- Set `scheme` when included in `host` configuration option
939
940### Fixed
941- Fixed getting multiple numeric keys in `ArrayObjectCache`
942- Fixed setting `port`, `database`, `maxttl` and `retry_interval` as numeric string
943
944## v1.8.2 - 2020-08-11
945### Changed
946- Reverted eager plugin name change in v1.8.1
947- Updated plugin URL to new domain to avoid redirects
948
949### Fixed
950- Don't flag drop-in as invalid when it's just outdated
951
952## v1.8.1 - 2020-08-11
953### Changed
954- Look for API in `object-cache-pro` directories
955
956### Fixed
957- Fixed an issue with numeric keys and improved error handling in `get_multiple()`
958
959## v1.8.0 - 2020-07-23
960### Added
961- Added `username` configuration option for Redis 6 ACL support
962- Added `cache` configuration option to set a custom object cache class
963- Added `connector` configuration option to set a custom connector class
964- Added `flush_network` configuration option (defaults to `all`)
965- Support flushing individual sites via _Network Admin > Sites_
966- Added `--skip-flush-notice` option to `wp redis enable` command
967- Added health check to ensure asynchronous flushing is supported
968- Added health check to ensure drop-in can be managed
969- Added intuitive alias for all WP CLI commands
970- Added support for `wp_cache_get_multiple()` introduced in WP 5.5
971
972### Changed
973- Renamed "Dropin" to "Drop-in" everywhere
974- Support flushing individual sites using `wp redis flush`
975- Hide Redis memory from dashboard widget in multisite environments
976- Display notice when license token is not set or invalid, as well as when the license is unpaid or canceled
977
978### Fixed
979- Explicitly set permissions of `object-cache.php` to `FS_CHMOD_FILE`
980
981## v1.7.3 - 2020-07-10
982### Fixed
983
984- Support older versions of Query Monitor
985- Ignore HTTP errors for license verification requests
986- Prevent undefined index notice in `ObjectCache::info()`
987- Prevent call to undefined function in `Licensing::telemetry()`
988
989## v1.7.2 - 2020-07-09
990### Added
991- Use `wp_opcache_invalidate()` on drop-in
992- Refactored `Diagnostics` to use `Diagnostic` objects
993
994### Changed
995- Minor dashboard widget improvements
996- Minor Query Monitor extension improvements
997- Cleanup plugin options upon deactivation
998- Disable FOSS version when activating plugin to avoid confusion
999
1000### Fixed
1001- Escape more HTML outputs
1002- Prevent unnecessary license verification requests
1003
1004## v1.7.1 - 2020-06-08
1005### Fixed
1006- Always send `setOption()` values as string
1007- Fixed Query Monitor panels not showing up for some setups
1008- Fixed `ArrayObjectCache` fallback instantiation in `wp_cache_init()`
1009- Format all commands parameters using `json_encode()` in Query Monitor panel
1010
1011## v1.7.0 - 2020-05-30
1012### Added
1013- Added support for Query Monitor
1014- Added context to license issues in the dashboard widget
1015- Show updates for must-use plugin and object cache drop-in
1016
1017### Changed
1018- Improved formatting of config values in diagnostics
1019- Don't highlight `noeviction` policy when maxTTL is set
1020
1021### Fixed
1022- Prevent unnecessary plugin update requests
1023
1024## v1.6.0 - 2020-05-11
1025### Added
1026- Support PHP 7.0 and PhpRedis 3.1.1
1027- Indicate missing license token in dashboard widget
1028
1029### Changed
1030- Switched to `WP_CLI\Utils\proc_open_compat()` for `wp redis cli`
1031- Ping Redis during object cache initialization to catch `LOADING` errors
1032
1033### Fixed
1034- Fixed potential `TypeError` during `upgrader_process_complete` action
1035
1036## v1.5.1 - 2020-04-29
1037### Fixed
1038- Fixed global group cache keys
1039
1040### Security
1041- Prevent XSS injection using cache group names when using Debug Bar
1042
1043## v1.5.0 - 2020-04-22
1044### Added
1045- Added `Requires PHP` and `Network` to plugin header fields
1046- Show supported compression formats in site health
1047
1048### Changed
1049- Initialize plugin after all plugins have been loaded
1050- Improved the plugin version and basename detection
1051- Improved muting the `wp redis cli` auth warning
1052- Don't require setting `port` when connecting to a unix socket
1053- Validate config connection information before connecting
1054- Always inline widget styles (1015 bytes)
1055- Always inject plugin details into `update_plugins` transient
1056- Improved obfuscation of sensitive values
1057- Hide health link from plugin actions in WP <5.2 and multisite networks
1058- Prevent widget color clashing with color scheme
1059
1060### Fixed
1061- Fixed detection of multisite networks
1062- Fixed setting global and non-persistent groups
1063- Fixed notices in Debug Bar extension
1064- Fixed `INFO` command when using cluster
1065
1066### Removed
1067- Removed `wp_clear_scheduled_hook` for `rediscache_report`
1068
1069## v1.4.0 - 2020-02-27
1070### Added
1071- Added support for storing `alloptions` key as hash
1072- Added `wp redis cli` command to spawn `redis-cli` process with configuration
1073- Support `WP_REDIS_DIR` constant in `mu-plugin.php` stub
1074
1075### Changed
1076- Ensure object cache drop-in is valid before flushing via CLI
1077- Colorized `wp redis flush` errors
1078
1079### Fixed
1080- Fixed typo in `RedisConfigMissingException`
1081- Fixed logs missing from Debug Bar
1082- Fixed cloning logic in `PhpRedisObjectCache::storeInMemory()`
1083- Inline styles when plugin is symlinked or located outside of web root
1084
1085## v1.3.0 - 2020-02-06
1086### Added
1087- Added support for asynchronous flushing
1088- Added support for data compression using LZF and Zstandard
1089- Added network admin dashboard widget
1090- Added `wp redis flush` command with support for `--async` flag
1091- Automatically update drop-in after plugin update
1092- Show used and max memory in widget, site health and Debug Bar
1093
1094### Changed
1095- Switched to using `ErrorLogLogger` by default
1096- The `ArrayLogger` now extends `ErrorLogLogger` and vice versa
1097- The log levels now default to `['emergency', 'alert', 'critical', 'error']`
1098- Changed log level of `ObjectCache::error()` from `critical` to `error`
1099- Introduced `PhpRedisMissingException` and `PhpRedisOutdatedException`
1100- Attempt direct filesystem access when WP filesystem initialization fails
1101- Renamed internal cache methods in `PhpRedisObjectCache` to be more descriptive
1102- Capture more errors by using `Throwable` in some places
1103- Moved Debug Bar HTML into template files
1104- Support setting `log_levels` configuration option to `null`
1105
1106### Removed
1107- Support setting `token` and `password` to `null`
1108- Removed captured errors from site health information
1109
1110## v1.2.1 - 2020-01-20
1111### Added
1112- Added health checks link to plugin actions
1113
1114### Changed
1115- Made initialization exceptions more helpful
1116- Escape HTML in Debug Bar log messages
1117- Improved pinging cluster nodes
1118
1119### Fixed
1120- Fixed duplicate prefix when using cluster
1121- Fixed undefined index notices in `Licensing`
1122- Fixed a issue when loading widget styles as must-use plugin
1123- Resolved minor spelling mistakes
1124
1125## v1.2.0 - 2019-11-29
1126### Added
1127- Added dashboard widget
1128- Added support for automatic WordPress updates
1129- Added diagnostic tests and information to _Tools > Site Health_
1130- Added `token` configuration option to set license token
1131
1132### Changed
1133- Disable object cache when deactivating/uninstalling the plugin
1134
1135### Fixed
1136- Fixed DebugBar integration on case-sensitive filesystems
1137
1138## v1.1.0 - 2019-11-19
1139### Added
1140- Added log levels
1141- Added `WP_REDIS_DISABLED` environment variable
1142
1143### Changed
1144- Use `PhpRedisConnection` for each master when flushing clusters
1145- Obfuscate all non-`null` passwords in diagnostics
1146- Allow password to be `null` for more convenient fallbacks
1147
1148### Fixed
1149- Prevent timeouts when flushing database
1150- Use inline styles to clear floats in Debug Bar panels
1151
1152### Security
1153- Obfuscate password in constants section of diagnostics
1154
1155## v1.0.0 - 2019-11-01
1156### Added
1157- Initial stable release
1158