Build1 distinct publisher3 min readPublished
A dev.to account of moving a production WooCommerce store down to Nginx FastCGI cache makes its case on concurrency rather than milliseconds, then spends most of its trouble on the WooCommerce cart cookie. That is the right order.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The twenty-worker illustration and the "thousands of cached hits per second" figure sit close together in the post, and converting them to the same units is where the layer argument gets its edge. [9] [11] Average service time equals concurrency divided by throughput. Twenty PHP-FPM slots at a thousand requests a second gives each plugin-served cache hit 20 ms to complete; at two thousand a second it gets 10 ms. [19] All of that budget is spent before your saved HTML moves: a process spawn, an interpreter boot, then the drop-in itself. [4] Nginx has none of it to do on a hit, because PHP-FPM is never invoked and wp-load.php never runs. [5]
This is also why a single-request timing test is the wrong instrument. The author is explicit that under ordinary traffic the gap barely registers on a stopwatch. [6] A plugin's benchmark table measures a request that gets a worker slot immediately; the ceiling is about the requests that do not. [7] [8]
The Nginx throughput number is the author's, for his hardware, and the post carries no before-and-after measurement from the migration itself. [11] [20] For it to transfer you need the cache store answered from memory rather than off contended storage, response bodies small enough that you are not bandwidth-bound, and nothing upstream doing work on a hit. Treat it as a shape rather than a spec.
The cart exclusion is the part I would budget real time for. A blanket bypass keyed on woocommerce_items_in_cart or the session cookie reads as though it means "this visitor has a cart". [13] WooCommerce often sets that cookie on the first page load, well before any add-to-cart, and it then persists for the session. [14] So the rule is firing on a cookie that mostly records having met the shop. Every later page for that visitor is uncached, sitewide, and uncached TTFB on a WooCommerce store runs into seconds once unindexed postmeta queries or a cold object cache are involved. [15] [16]
The recommended route is to stop treating cart state as a caching signal at all. wc-cart-fragments.js refreshes the mini-cart, the item count and the totals over a light AJAX call after the page loads, through the woocommerce_add_to_cart_fragments filter. [17] That holds when the theme actually uses the mechanism, which the author says to verify rather than assume. [18] The contrapositive is the migration task: any header rendering the item count in PHP makes the HTML vary by cart state, and the cached copy will be wrong for someone. Check the theme before the Nginx config, not after.
What does not disappear is PHP-FPM. Logged-in sessions and checkout still need workers, and the change is that cache hits stop competing with them for slots. [10] You still size the pool, and now you size it for the traffic that takes money.
Ranked by verification strength, evidence, and original report placement.
A dev.to post describes moving a production WooCommerce site from plugin-based page caching to Nginx FastCGI cache, including problems hit during the move.
The post names WP Rocket, WP Super Cache, W3 Total Cache and WP Optimize as caching plugins WooCommerce operators commonly install.
A page-cache plugin still runs inside PHP, using an early hook, sometimes an advanced-cache.php drop-in that fires before most of WordPress loads, to check for a saved HTML file for the URL.
With a plugin cache, a PHP process still has to spin up, the interpreter still has to boot and the drop-in still has to execute before the visitor gets a byte back.
On an Nginx FastCGI cache hit, Nginx serves the page from its own cache store, PHP-FPM is never invoked and wp-load.php does not run.
Under normal traffic the difference between the two approaches barely shows up in a stopwatch test, and both feel fast enough to a single visitor.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Six MariaDB versions, one real difference: the only reason to leave 10.6 is the July 2026 clock1 distinct publisher
build
WooCommerce catalog mode: the price you hid is still sitting in eight places1 distinct publisher
build
Build concurrency on one VPS is a division problem, and the app you serve pays the remainder1 distinct publisher
build
The guard that worked in tests and still wrote 2,684 live records1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Mechanism explained, outcome unmeasured
The causal chain is laid out cleanly enough to argue with: PHP-FPM slots are finite, plugin cache hits consume one, FastCGI hits do not. What never arrives is a number. The store at the centre of the piece produces no before-and-after TTFB, no hit rate, no load test — and the text breaks off mid-sentence on purging, so even the staleness argument is incomplete.
One unnamed store
The only deployment on the record is the author's own: a single production WooCommerce site, unnamed, with no traffic figure. Nginx FastCGI caching is obviously used far more widely than that, but this reporting does not show it, and we will not credit reach nobody here has documented.
Restrained argument, loose numbers
This is a modest overstatement, and mostly by omission. The author does the unusual thing of conceding the weak version of the claim — a single visitor cannot feel the difference — and scopes the advice to stores with promo or growth exposure. Then two unbacked quantities do the heavy lifting anyway: thousands of cached hits per second on "modest hardware", and multi-second uncached TTFB as common. Strip those and the case still stands on concurrency; leave them in and it sounds settled when it is only plausible.
Reputation, not revenue
Nothing is being sold. There is no product, no sponsor, no hosting affiliate in the text, and the four plugins named as the wrong layer are competitors to no one the author represents as far as this piece shows. What remains is the ordinary stake of a developer publishing under a byline on dev.to: expertise on display, and a case that reads better when it reads decisive.
Checkable where it counts
Middling, and for a specific reason. The mechanics doing the work here — pm.max_children, the advanced-cache.php drop-in, the cart-fragments filter — can each be checked against public documentation without taking the author's word for anything. The performance numbers cannot: they rest entirely on one writer's account of one store. So we are fairly confident about how this works and barely confident about how much it wins.