Skip to main content
4 seconds in, under 200 ms out

WordPress Performance

Four seconds is an eternity online. We rebuild WordPress performance on FrankenPHP Worker Mode and Redis, bringing load times under 200 ms and Core Web Vitals into the green.

Four seconds to load?
Google is already counting

Search rankings carry a stopwatch now. Google folds Core Web Vitals into its algorithm, and by its own measurements each extra second of load time lifts bounce rate by up to 32%. Poor WordPress performance quietly eats whatever you spend on being found.

The typical WordPress site on shared hosting needs 2-5 seconds to put a page on screen, and the waste hides in plain sight. The plugins ship JavaScript to visitors who will never touch it, the theme runs queries no page asked for, and the server reassembles the whole of WordPress from scratch on every single request before discarding the result and starting over for the next person.

After a few hundred audits like this one, the pattern is hard to miss. Reaching for another caching plugin rarely changes anything; what moves the needle is the architecture underneath.

<30ms

TTFB on FrankenPHP Worker Mode

98/100

Lighthouse Performance in production

32%

Bounce rate added per extra second

0ms

Total Blocking Time after the rebuild

Where do the seconds go?

WordPress itself is rarely the culprit. The slowdown lives in everything bolted on around it: the hosting it sits on and a plugin list nobody has pruned in years.
01 / 04

Plugin sprawl

Every active plugin brings its own JavaScript, CSS and database queries along for the ride. Run 20 of them and you can easily be shipping 400 KB of extra script plus 50+ queries on every page view.
02 / 04

A database doing repeat work

The EAV model behind WordPress is wonderfully flexible and painfully slow at scale. Without an object cache, the database grinds through identical work for each visitor, one by one.
03 / 04

Noisy neighbors

Hundreds of other sites share the machine yours runs on. Their traffic spike becomes your slow afternoon, and the PHP version is whatever the host happened to leave behind.
04 / 04

Caching as an afterthought

A caching plugin treats the symptom and leaves the cause alone. Real caching belongs a level further down, with Redis guarding the database and Varnish in front of the application itself.

FrankenPHP Worker Mode
boot once, answer instantly

Classic PHP hosting has no memory. Every request triggers the same ritual: the framework loads, the database connects, each plugin initializes, the page renders, and then the whole thing is thrown away. A moment later the next visitor arrives and the ritual begins all over again, thousands of times a day on a busy site.

Worker Mode does away with that waste. Rather than rebuilding everything from scratch, the server keeps the application loaded in memory between requests, so a response starts coming back the moment the request hits. With the startup work already done, TTFB drops below 30 milliseconds. A conventional PHP-FPM setup, by contrast, spends 200-300 ms just getting going.

Underneath it all sits Caddy, so automatic HTTPS arrives with zero configuration, and so do HTTP/2 and HTTP/3. Early Hints ship as standard as well, letting the browser start fetching assets while the server is still composing the rest of the page.

WordPress performance, layer by layer

01 / 06

Redis Object Cache

Query results wait in memory instead of being recomputed on every visit. Carts, sessions and transients come straight out of Redis, leaving MySQL out of the hot path entirely, and database load falls off a cliff.
02 / 06

Images sized for the screen

Every upload converts to WebP or AVIF automatically, and responsive srcset variants make sure each device receives an image cut for its own screen. So nobody on a phone gets stuck pulling a 4 MB JPEG down over a mobile connection.
03 / 06

Critical CSS

Only the styles needed above the fold ship inside the HTML itself. The rest arrives asynchronously, after the visitor already has something to read, so nothing blocks the render and First Contentful Paint arrives sooner.
04 / 06

Lazy loading

Nothing below the fold loads until the visitor scrolls toward it, images, iframes and heavy embeds included. The first load stays light, and Time to Interactive finally behaves itself.
05 / 06

Edge caching near the user

Distance adds milliseconds, so static assets answer from the edge node nearest each visitor. Deploys stay clean too, because Traefik invalidates only the cache entries a release has touched instead of flushing everything.
06 / 06

Database tuning

Query Monitor names the slow queries before anything gets touched. We add the missing indexes and clear stale transients out of wp_options, then measure the gain from each change before moving to the next one.

One site, two architectures

butikken.no4.2s
19 plugins on shared hosting
butikken.no180ms
4 plugins on FrankenPHP + Redis

The content never changed and neither did the CMS — everything below them did. Architecture accounts for the entire gap [1].

Core Web Vitals: the full scoreboard

Typical WordPress
LCP
3.2s (poor)
INP
280ms (needs improvement)
CLS
0.15 (needs improvement)
TTFB
1.2s
FCP
2.8s
Total Blocking Time
450ms
Lighthouse Score
45-65
Built by PXL
Google's threshold
LCP
0.8s (good)
INP
12ms (good)
CLS
0.01 (good)
TTFB
28ms
FCP
0.6s
Total Blocking Time
0ms
Lighthouse Score
95-100

How we measure WordPress performance

We would rather not trust a gut feeling when performance is on the line. Every optimization is held against a hard threshold, and we keep the receipts on what each one changed.
01 / 04

Lighthouse CI

Every build runs Lighthouse automatically inside the CI/CD pipeline. Drop below the performance threshold and the build never reaches production, because the pipeline refuses it on the spot and a regression gets stopped at the door.
02 / 04

Real User Monitoring

Lab numbers tell half the story. Core Web Vitals from real visitors fill in the other half, split by device and geography so we can see how mobile holds up against desktop and how Norway compares to the rest of the world.
03 / 04

Synthetic monitoring

The robots test the site from several corners of the world, day and night. When performance drifts downward over weeks, the trend line says so long before any human notices in a browser.
04 / 04

Query Monitor

Per-pageview analysis of database queries, hooks and PHP memory usage. Instead of guesswork, each bottleneck ends up pinned to a specific file and a specific line number you can point at.

Do these warning signs look familiar?

The symptoms tend to announce themselves:

  • Two-plus seconds of load time, caching plugin or not
  • A Lighthouse Performance score stuck below 70
  • Core Web Vitals warnings piling up in Google Search Console
  • Visitors bailing before anything useful appears
  • Mobile noticeably slower than desktop
  • Performance dipping exactly when campaigns drive traffic in

If most of that list rings true, the answer lives in your infrastructure — not in plugin number twenty-one.

Questions we hear a lot

SB
CG
JB
About us

How fast could your WordPress site actually run?

Drop us the URL and we'll come back with hard numbers on what's possible.