OPTIMIZATION LITE

Site Doctor

One button that scans the whole site — configuration, autoload burden, database bloat, captured slow queries, and 21 Redis object-cache checks — and ranks every finding worst-first, each linked to the module that fixes it.

What It Does

Site Doctor answers "where do I start" in one click. Press "Find what's slow" and it runs its own configuration checks alongside the measurements the other modules already own — autoload burden, database bloat, and any slow queries that have been captured — then ranks everything worst-first so you are not guessing which module to open. Every finding explains why it matters and links straight to the module that owns the fix. New installs land on this page after activation. The configuration checks verify that OPcache is enabled and healthy (hit rate, OOM restarts, key table), that an object-cache drop-in is actually engaged (a drop-in pointing at a dead Redis backend is flagged critical), that your homepage is served from a page cache (via a loopback HTTP probe), whether LiteSpeed Cache is active, and whether any enabled WooCommerce payment gateway is stuck in test/sandbox mode. Where an object cache is missing it recommends a specific one for your server — including SQLite Object Cache on shared hosting, where Redis usually is not available — rather than a generic "add Redis", and if a suitable plugin is already installed it tells you to enable that one instead of installing another. Since version 1.7.0 it also carries 21 Redis object-cache checks that read the server's running configuration instead of inferring health from a successful connect. Each finding gets a severity (ok/info/warn/critical) and a guided fix with the exact values to set. It is read-only, runs only on demand, and everything runs locally on your server.

Features

  • Whole-site scan in one pass: configuration checks plus autoload burden, database bloat, and captured slow queries, all ranked worst-first
  • Every finding explains why it matters and links to the module that owns the fix
  • Sources that were skipped are named, so a short list of findings is never mistaken for a clean site
  • Configuration checks cover OPcache health, object-cache drop-in status, page cache (loopback probe), LiteSpeed Cache detection, and WooCommerce payment gateway test-mode detection
  • Object-cache recommendation is specific to your server — SQLite Object Cache on shared hosting where Redis is not available, rather than a blanket "add Redis" — and tells you to enable a suitable plugin you already have installed instead of installing a second one
  • Read-only by design — the scan never changes anything; every fix is guided remediation you apply yourself
  • Never runs on page load — only on an explicit "Find what's slow" click or via WP-CLI (wp multitool doctor)
  • OPcache analysis: distinguishes genuinely disabled OPcache from hosts that restrict the status API (Kinsta/WP Engine style opcache.restrict_api), checks hit rate, OOM restarts, and key table saturation
  • Flags object-cache.php present but not engaged (dead Redis backend) as critical — the failure that page-load checks never surface
  • Vendor detection for the object-cache drop-in (Redis Object Cache, Memcached) from its file signature
  • 21 Redis object-cache checks (added in 1.7.0) that talk to the server and read its running configuration — almost every Redis check in the WordPress ecosystem only asks whether the connection succeeded, a test that cannot fail the ways Redis actually fails
  • Catches maxmemory-policy noeviction under a memory ceiling: once full, Redis rejects every write, so WordPress runs the query anyway and pays a round-trip on top — or the drop-in throws and the site returns HTTP 500
  • Catches eviction thrashing, measured as a delta between two scans because evicted_keys is cumulative since the server booted — the first scan records a baseline and says so
  • Catches a shared keyspace with no prefix, where a cache hit can return another site's data, plus salts too generic to isolate anything
  • Catches load-bearing cache groups on the ignore list — options above all, which carries alloptions — so Redis is connected and paid for on every request while caching none of what would repay it
  • Catches missing global groups on multisite, where keys get a per-blog prefix and one site can read another site's users and settings
  • Catches round-trip latency that outweighs the database work saved: a WordPress page issues on the order of a hundred cache lookups, so latency is multiplied before anything is gained. It reports the cost and stops short of a verdict — whether the cache is still worth keeping is an A/B on your own templates
  • Also checks replica role, persistence failures and fork stalls, connection churn, flush storms, memory fragmentation, hit rate, and the autoload blob against the ~1MB per-value ceiling
  • Read-only and on demand only, never on a normal page load: it uses INFO, CONFIG GET, DBSIZE and one bounded SCAN, and never KEYS, which would block the server for the length of the whole keyspace
  • Where a host blocks CONFIG GET (Kinsta, WP Engine and Cloudways among them) the affected checks report "cannot verify this here" and never "ok" — no data is not the same as no problem. Cluster and Sentinel are detected and skipped rather than described from one node
  • The eviction-rate baseline is stored in a non-autoloaded option, not a transient: a transient would live in the very Redis being measured and be evicted by the thrashing it exists to detect
  • Sites not using Redis get no Redis findings at all, rather than a list of "not applicable" rows
  • Loopback cache probe reads real cache headers (x-litespeed-cache, cf-cache-status, x-cache, Age, x-varnish, x-kinsta-cache) and distinguishes HIT, MISS, and origin-rendered responses
  • Probe falls back to localhost with a Host header for split-horizon DNS and Docker environments; reports "probe not possible" instead of guessing
  • WooCommerce gateway check covers Stripe, PayPal, Przelewy24, PayU, Mollie, Square, Braintree, Authorize.net, and more — flags enabled gateways still in test/sandbox mode where real customers cannot pay
  • Non-production host detection (.loc, .test, staging.* subdomains, localhost) automatically downgrades severities — a dev clone without a page cache is normal, not critical
  • Guided fixes include exact php.ini values, computed for your server (e.g. suggested opcache.memory_consumption and max_accelerated_files)
  • Scan result cached for 5 minutes in a transient — the loopback probe only runs during a scan
  • Severity summary pills (critical/warning/info/ok) at the top of the results
  • CLI twins: wp multitool doctor for the ranked whole-site scan, and wp multitool redis [--force] [--format=json] for the full object-cache report

How to Use

  1. Open Site Doctor

    Go to WP Multitool > Site Doctor — new installs land here after activation. The page shows the last cached scan if one exists; it never triggers a scan just by loading.

  2. Run a scan

    Click "Find what's slow". The module runs its configuration checks, the Redis object-cache checks where Redis is in use, and a loopback HTTP probe of your homepage, then pulls in autoload burden, database bloat and captured slow queries. Results stream back and take a few seconds.

  3. Start at the top

    Findings are ranked worst-first, each as a card with a severity badge, an explanation of why it matters, and the raw data (hit rates, cache headers, Redis policy and memory figures, gateway names). Skipped sources are named, so a short list is not a clean bill of health.

  4. Apply the guided fixes

    Each non-ok finding includes a concrete fix — exact php.ini directives, the redis.conf line to persist, the WP_REDIS_* constant to set, or the module that owns the problem. Site Doctor never applies changes itself.

  5. Re-scan to verify

    After fixing, click "Find what's slow" again (the button always forces a fresh scan, bypassing the 5-minute cache) to confirm the finding turned green. The Redis eviction rate needs two scans a minute or more apart, because the underlying counter is cumulative — the first run only records a baseline.

FAQ

Does Site Doctor change anything on my site?

No. It is entirely read-only. Every fix is "guided" — the module tells you exactly what to change and where, but never edits configuration, files, or the database itself.

Does the scan slow down my site?

No. The scan only runs when you explicitly click "Run scan" (or run wp multitool doctor via WP-CLI). The only network activity is the loopback probe of your own homepage — up to three requests when localhost fallbacks are needed — and the result is cached for 5 minutes.

Why does the page cache check say "loopback self-probe not possible"?

Some hosts block servers from making HTTP requests to themselves (loopback blocks or split-horizon DNS). Site Doctor tries a localhost fallback with a Host header, but if that also fails it reports "probe not possible" instead of guessing. Check the cache header from an external request instead.

What does the WooCommerce gateway check actually catch?

Enabled payment gateways that are still in test/sandbox mode. On a live shop that means real customers cannot pay. It checks the common flag styles (testmode, sandbox, mode/environment strings) across a dozen popular gateways, and catches setup wizards that save a localized label instead of the canonical "production" value.

Why are my severities lower on my staging site?

Site Doctor detects non-production hosts (localhost, .loc/.test/.local TLDs, staging./dev. subdomains) and downgrades critical to warning and warning to info. A dev clone without a page cache is normal, not an emergency. Severities are only ever downgraded, never upgraded.

My Redis says "Connected". What do these checks add?

Almost every Redis check in the WordPress ecosystem opens a socket, sends a PING, gets a PONG, and reports green. That test cannot fail the ways Redis actually fails. A server can answer PING instantly while rejecting every write because it hit its memory ceiling under a noeviction policy, discarding keys as fast as WordPress writes them, serving another site's data from a shared keyspace, caching nothing that matters because the options group is on the ignore list, or costing more in round-trips than it saves in database work. These 21 checks read the server's running configuration instead of inferring health from the handshake.

Can the Redis checks slow down or damage my Redis?

They are read-only and run only when you scan, never on a normal page load. They use INFO, CONFIG GET, DBSIZE and one bounded SCAN. They never use KEYS: the connection is shared with the live site, and KEYS blocks the server for the length of the entire keyspace. Nothing is written, flushed, or reconfigured.

My host blocks CONFIG GET. What happens then?

The affected checks report "cannot verify this here" and tell you how to find out yourself. They never report "ok". CONFIG GET is disabled or renamed on a large share of managed hosting, Kinsta, WP Engine and Cloudways among them, and a check that passes because it could not look turns an unknown into false reassurance. Redis Cluster and Sentinel are detected and skipped for the same reason — one node's memory ceiling does not describe the network.

Why does the eviction rate need two scans?

The evicted_keys counter Redis exposes is cumulative since the server booted, so a single reading says nothing — four million evictions on a box with 200 days of uptime is not a signal. Only the delta between two reads is. The first scan records a baseline and tells you so; run it again a minute or more later for the rate. The baseline is stored in a non-autoloaded option rather than a transient on purpose: with an object cache installed, transients live in the very Redis being measured, so a baseline kept there would be evicted by the thrashing it exists to detect.

Is Redis always worth having?

No, and the checks do not assume it is. An object cache pays off only once the database work it avoids exceeds the round-trips it adds. A WordPress page issues on the order of a hundred cache lookups, so latency to Redis is multiplied by that count before anything is saved. On a test page issuing 112 commands per request, a healthy Redis at 0.5ms round-trip — ordinary for a managed Redis on a separate host — was slower than no object cache at all. The round-trip check reports that cost and deliberately stops short of a verdict; which side of the line your site sits on is a measurement on your own templates, not a default.

Can I get the Redis report on the command line?

Yes: wp multitool redis for the full object-cache report, --force to bypass the 10-minute probe cache and re-query the server, and --format=json for machine-readable output. wp multitool doctor gives you everything, Redis included, ranked worst-first.

Ready to optimize your WordPress site?

Join developers using WP Multitool to debug, optimize, and maintain WordPress.

Get WP Multitool