WooCommerce Hosting Requirements: PHP Workers and RAM

WooCommerce Hosting Requirements: PHP Workers and RAM

The WooCommerce hosting requirements published by Woo — PHP 8.3, MySQL 8.0, 256 MB of memory — describe the floor at which the software will boot, not the hardware that will keep a store up on a Monday morning. The number that actually decides whether your checkout survives traffic is one almost no host puts on its pricing page: how many PHP processes can run at the same time.

Below: the published minimums and where they mislead, the six criteria I judge a store host against, what actually burns server capacity in WooCommerce (it is not page views), a sizing table by orders per day, a comparison of the four hosting shapes against those criteria, and the commands to measure your own store before you pay anyone. Versions and figures checked 3 October 2026 against WooCommerce 11.1.2 on WordPress 7.1.2.

The published minimums, and the one that contradicts itself

Two official pages state requirements, and they do not agree.

Woo’s own Server Requirements document asks for WordPress 6.9 or greater, PHP 8.3 or greater (tested up to 8.4), MySQL 8.0 or MariaDB 10.6 or greater, a memory limit of 256 MB or greater, and HTTPS. WordPress core’s requirements page lands in the same place: PHP 8.3, MySQL 8.0 or MariaDB 10.11, HTTPS on every install.

Then look at the plugin header on the wordpress.org listing for WooCommerce 11.1.2. It says Requires PHP: 7.4. That is the version the installer enforces, and it is four major releases behind what the documentation asks for. PHP 7.4 left security support in November 2022.

What the gap means in practice

WooCommerce will install and run on PHP 7.4 without a warning, on a version of PHP that stopped receiving security fixes nearly four years ago. “It installed fine” is not evidence your stack is supported. If a host is still offering PHP 7.4 as a current option in 2026, treat that as information about the host rather than about PHP.

Treat 256 MB the same way. It is the limit below which things visibly break, not a target. On a store with a dozen extensions I set WP_MEMORY_LIMIT to 512 MB and WP_MAX_MEMORY_LIMIT to 768 MB, because imports and report generation spike well above what a product page needs. If you are hitting the ceiling rather than choosing it, that shows up as a specific error — see how to fix the WordPress allowed memory size exhausted error for the diagnosis.

// wp-config.php, above the "stop editing" line
define( 'WP_MEMORY_LIMIT', '512M' );
define( 'WP_MAX_MEMORY_LIMIT', '768M' );

Those two constants only raise the ceiling PHP will allow WordPress to request. They cannot exceed the memory_limit your host sets in PHP itself, which is why checking the real value matters more than setting the constant. Checking and updating PHP safely covers how to read what you are actually running.

The six criteria I judge a WooCommerce host against

Stating these up front because they decide everything below, and because most hosting comparisons judge on the wrong axis. Uptime percentages and TTFB on the homepage tell you almost nothing about a store, since the homepage is the one page that caches perfectly.

  1. Published PHP worker or concurrency count. Not “unlimited traffic” — an actual number, or at minimum a documented concurrency model. A host that will not tell you is telling you something.
  2. A persistent object cache you do not have to run yourself. Redis or Memcached provisioned and supported, not “you may install a plugin”.
  3. Correct cache exclusions out of the box. Cart, checkout and account pages bypassed, and the WooCommerce session cookie respected by the edge cache.
  4. A real system cron, not WP-Cron. WooCommerce’s background queue is not optional work; it is how orders get their follow-up actions.
  5. Database headroom and the right to add an index. Shared MySQL with no ability to run DDL is a hard ceiling on a growing catalogue.
  6. Backups that actually contain your orders, and a staging site. Post-HPOS, a backup that only captures wp_posts is not a backup of your store.

Price is deliberately not on that list. It belongs at the end, once you know which tier you need — otherwise you shop down into a plan that cannot run the store and spend the savings on a consultant.

What actually consumes capacity: uncached requests, not page views

This is the part that makes WooCommerce hosting requirements different from blog hosting requirements, and it is worth being precise about.

A PHP worker, in the words of Nexcess’s own documentation, is a background computing process that handles “every action requested from a particular website that isn’t cached”. When they are all busy, requests queue. Nexcess allocates a minimum of ten per site and says plainly that too few workers can become “a bottleneck slowing down a website significantly or even bringing it entirely down” — which your visitors experience as a 504, or as the 503 service unavailable error.

On a brochure site, nearly every request is cached, so ten workers is generous. A store is the opposite case, for four reasons:

  • Cart, checkout and My Account can never be cached. Every hit on those is a full PHP request plus database queries.
  • Logged-in and session-carrying visitors bypass the page cache entirely. One shopper with something in their cart browsing fifteen category pages is fifteen uncached requests.
  • AJAX fires constantly. Add-to-cart, cart fragment refreshes, variation lookups and filtered product queries each hit admin-ajax.php or the Store API, and each takes a worker.
  • The background queue competes with your shoppers. Action Scheduler runs inside the same worker pool as your front end unless you move it to CLI.

So the useful question is never “how many visitors a month”. It is roughly: peak concurrent uncached requests × average request duration. A 400 ms uncached page and ten workers gives you about 25 such requests per second before a queue forms. Halve the request time and you double the capacity — which is why fixing a slow query is often cheaper than buying a bigger plan.

WooCommerce hosting requirements by store size

These are my own working figures from sizing and rescuing stores, not vendor specifications, and I would rather give you a number you can argue with than a vague “it depends”. Orders per day is the driver because it tracks checkout concurrency better than traffic does. Assume a reasonably lean theme and twenty or so extensions.

Store sizePHP workersRAMCPUObject cacheDatabaseShape that fits
Launching
0–10 orders/day, under 500 products
4–62 GB2 vCPUNice to haveShared MySQL is fineGood shared or entry managed WordPress
Established
10–100 orders/day, under 5,000 products
8–124 GB2–4 vCPURequiredOwn MySQL instance; you can add indexesManaged WordPress or a 4 GB VPS
Busy
100–500 orders/day, under 20,000 products
16–248 GB4–8 vCPURequired, with its own memory budgetDedicated DB host; slow query log onWoo-specific managed hosting or a tuned VPS
High volume
500+ orders/day, or 20,000+ products, or flash sales
24+, and autoscaling16 GB+8+ vCPUSeparate Redis instanceRead replica; search moved out of MySQLManaged cluster, or an engineer on retainer

Two notes on reading that table honestly. First, product count matters mostly through admin and search queries, not front-end page loads — a 20,000-product catalogue is painful in wp-admin long before it is painful on a category page, which is the subject of diagnosing a slow WordPress admin dashboard. Second, the “high volume” row is where LIKE '%term%' product search stops being viable and you want a real index; WooCommerce product search plugins compared goes through the options.

Shared, VPS, managed WordPress or Woo-specific

Four shapes, scored against the six criteria above. I am describing categories rather than listing vendor prices, because plan specifications and renewal rates change monthly and a price I quote today will be wrong by the time you read it.

CriterionBudget sharedUnmanaged VPSManaged WordPressWoo-specific managed
Published concurrencyAlmost never. “Unlimited traffic” with an undisclosed process cap, usually low single digitsYou control it — you also have to calculate it from RAM yourself and get it wrong onceUsually published or obtainable from support. Nexcess documents a floor of 10 per sitePublished, and sized for uncached traffic rather than blog traffic
Object cache providedRarely, and often shared across accounts so your keys get evicted by someone else’s siteAvailable — you install and maintain Redis, including its own memory limit and eviction policyCommonly included on mid tiers and upIncluded and tuned, usually with a dedicated memory allocation
Cache exclusions correct by defaultNo. This is the single most common cause of the “someone else’s cart” bugNothing is configured for you; the rules are yours to writeGenerally yes for the standard Woo pages; custom checkout URLs still need addingYes, including session-aware edge rules
Real system cronSometimes a 15-minute cron if you configure it; otherwise WP-Cron onlyYes, full crontab accessUsually yes, often every 5–15 minutesYes, frequently with Action Scheduler run via WP-CLI
DB headroom and DDLShared instance, noisy neighbours, no slow query log, index changes may be blockedFull control, full responsibility for tuning innodb_buffer_pool_sizeOwn database, slow query log usually available on requestDedicated or tuned DB, often with replicas on upper tiers
Backups that include HPOS tablesUsually a whole-database dump, so yes — but restore testing is on you and retention is shortWhatever you build. Most people build it badly and discover this during an incidentYes, with staging and one-click restoreYes, plus staging that clones order data
Where it genuinely fitsPre-revenue and under roughly 10 orders/day. It is not a scam, it is a different productYou have a sysadmin, or you are one, and you want the cost curveThe default correct answer for most stores between 10 and 500 orders/dayFlash sales, 500+ orders/day, or when downtime costs more per hour than the plan costs per year
Main weaknessUndisclosed limits mean you cannot plan, and you find the ceiling during your best sales dayEvery hour you spend tuning MySQL is an hour not spent selling. Security patching is yoursPlugin blocklists can forbid the caching or backup plugin you already rely on. Renewal pricing often jumps after year oneExpensive, and overkill below a few hundred orders a day

The short version

Under 10 orders a day, decent shared hosting is a rational choice and anyone telling you otherwise is selling something. Between 10 and 500, managed WordPress hosting with Redis and a real cron is the answer often enough that you need a specific reason to pick anything else. Above that, or if you run flash sales, you are buying concurrency and an incident response team, and the plan price stops being the relevant number.

Your cache hit ratio is worse than your host’s dashboard claims

Here is a failure mode that sends people shopping for more RAM when they do not need it.

WooCommerce starts a session for a visitor and sets a cookie. Any decent page cache treats a session cookie as a signal to bypass the cache, which is correct — serving one shopper’s cart to another is the worst bug in ecommerce. The problem is that extensions routinely start a session for visitors who have done nothing at all, so a browsing visitor with an empty cart gets a cookie, bypasses the cache, and consumes a PHP worker for every page they look at.

WooCommerce acknowledged this directly. In version 10.3 Woo shipped an experimental option called Clear Customer Sessions When Empty, which runs on template_redirect at priority 999 — late, so extensions have had their chance to put something in the session — and if both the cart and the session are genuinely empty, it removes the server-side session and the cookie. It skips logged-in users, and it is disabled by default. You have to turn it on.

On a store where an analytics extension was starting sessions on every page view, enabling that moved a large share of category traffic back into the page cache. If your host reports a 95% hit ratio and your workers are still saturated, this is the first thing to check, before you upgrade anything. The mechanics of which pages may and may not be cached are covered in WooCommerce caching plugins: what breaks and what works.

It is still flagged experimental, so test it on staging with your actual extension set rather than switching it on during a sale.

The database: HPOS changed what “a backup of my store” means

Since WooCommerce 8.2, released in October 2023, High-Performance Order Storage has been the default for new installations. Orders no longer live in wp_posts and wp_postmeta. They live in four purpose-built tables:

wp_wc_orders
wp_wc_order_addresses
wp_wc_order_operational_data
wp_wc_orders_meta

This is a straightforward win for performance — order queries stop fighting every post, page and revision for the same index. It has two consequences for hosting that people discover at the worst possible moment.

First, any backup or migration tool that predates HPOS, or that works from a post-table export, will produce a file that looks complete and contains no orders. Verify by restoring to staging and counting rows, not by trusting a green tick. WooCommerce backup plugins compared goes through which tools handle this correctly.

Second, if you run a store built before 8.2 you may still be on the legacy post tables, or running both in sync during migration, which doubles order writes. Check which mode you are in under WooCommerce → Settings → Advanced → Features, and check whether compatibility mode is still on. Synchronising two order stores forever is a cost you are paying for nothing.

While you are in the database, the WordPress options table deserves a look. Autoloaded options are fetched on every single request, so a few megabytes of autoloaded transients left behind by a removed plugin taxes every page load:

wp option list --autoload=on --format=table \
  --fields=option_name,size_bytes --orderby=size_bytes --order=desc | head -20

Anything above a megabyte that you do not recognise is worth investigating. If the whole autoloaded set is over about 1 MB, that is a real tax on every uncached request, and it is free to fix.

A persistent object cache is the cheapest upgrade available

Without one, WordPress rebuilds its object cache from the database on every request. With one, the results of expensive queries persist between requests. For a store with a large catalogue this is routinely a bigger improvement than moving to a faster CPU, and on most managed hosts it costs nothing because Redis is already running.

The standard route is the Redis Object Cache plugin, at version 3.0.0 with over 500,000 active installations, 4.5 out of 5 from 179 reviews, tested to WordPress 7.1.2 and requiring PHP 7.2 or greater. It supports Predis, PhpRedis and Relay as clients. The thing to be clear about: the plugin is not the cache. It needs a Redis server to connect to. Installing it on hosting with no Redis available does nothing at all, which is a surprisingly common disappointment.

Check whether you already have one before buying anything, under Tools → Site Health → Status, where WordPress reports a missing persistent object cache as a recommendation. Or from the command line:

# Is an object cache drop-in actually in place?
wp eval 'echo wp_using_ext_object_cache() ? "external" : "none", PHP_EOL;'

# Does a Redis extension exist on this server at all?
php -m | grep -iE 'redis|relay'

If that first command prints none and the second prints nothing, Redis is a question for your host, not a plugin you can install your way out of. WordPress Site Health covers the other recommendations on that screen.

Action Scheduler is competing with your shoppers

WooCommerce queues background work — emails, subscription renewals, stock syncs, webhooks, data updates — through Action Scheduler. Its documented defaults are conservative, and worth knowing before you blame your host:

  • It claims a batch of 25 actions at a time (action_scheduler_queue_runner_batch_size).
  • It runs one concurrent batch (action_scheduler_queue_runner_concurrent_batches).
  • It processes for a maximum of 30 seconds per request (action_scheduler_queue_runner_time_limit).

By default those batches run through WP-Cron, which means they are triggered by visitor page loads and executed by the same PHP workers serving your front end. Two things follow. On a quiet store, nobody visits, so the queue stalls and order emails go out late — the same mechanism behind the missed schedule error. On a busy store, the queue steals workers from checkout exactly when checkout needs them.

The fix is to disable WP-Cron’s page-load trigger and drive it from the server, which is why system cron access is on my criteria list:

// wp-config.php — stop cron firing on visitor page loads
define( 'DISABLE_WP_CRON', true );
# crontab -e   (adjust the path to your install)
*/5 * * * * cd /home/user/public_html && wp cron event run --due-now >/dev/null 2>&1
*/5 * * * * cd /home/user/public_html && wp action-scheduler run >/dev/null 2>&1

Running the queue through WP-CLI is what Action Scheduler’s own performance documentation recommends for throughput, and it is better than raising the concurrency filters, which its docs warn “can substantially increase server load”. Check your backlog under WooCommerce → Status → Scheduled Actions; a pending count in the tens of thousands is a configuration problem, not a capacity problem.

Measure your own store before you pay anyone

Upgrading hosting to fix a slow site works about half the time. The other half, you move a badly behaved plugin onto faster hardware and it is still slow, now more expensively. Twenty minutes of measurement tells you which half you are in.

Start with the time it actually takes to generate an uncached page, since that number divided into your worker count is your real capacity. Request a URL with a cache-busting query string so you are timing PHP rather than the cache:

# Time to first byte on an uncached product page, five samples
for i in 1 2 3 4 5; do
  curl -o /dev/null -s -w "%{time_starttransfer}\n" \
    "https://example.com/product/some-product/?nocache=$RANDOM"
done

Under 400 ms is healthy. Around a second means you have roughly a quarter of the capacity you think you do. Over two seconds, no hosting plan will save you and you have a code problem to find first.

Then find where the time goes. Query Monitor, installed on staging, breaks a single page load into query count, slowest queries, and time attributed per plugin, which is the fastest way to identify the extension responsible. If the answer is one plugin generating 400 queries on a category page, that is the thing to fix. Troubleshooting a plugin conflict step by step covers isolating it safely on a live store.

It is also worth checking whether your database is simply too big to sit in memory, because that is a genuine hosting answer rather than a code one:

wp db size --tables --human-readable --format=table \
  | sort -k2 -h -r | head -15

If your data set comfortably exceeds the memory the database server has for its buffer pool, MySQL goes to disk on queries that should be instant, and more PHP workers will not help. That is the point at which “buy more RAM” is the correct diagnosis. A database that will not answer at all is a different problem — see fixing the error establishing a database connection.

Your theme and plugin stack sets the price of every request

Worth saying plainly, because it is the lever most store owners ignore while shopping for hardware: hosting requirements are partly a consequence of what you installed. A page that executes less PHP and runs fewer queries needs fewer workers to serve the same traffic, and on uncacheable pages — cart, checkout, account — there is no cache to hide behind.

The criterion I use is simple and measurable in Query Monitor: queries and PHP time on an uncached product page with the theme active and nothing else changed. Judge candidates on that, not on marketing copy.

By that measure, the mature lightweight options are the safe picks: GeneratePress and Kadence both have long track records on large WooCommerce stores, and a core block theme such as Twenty Twenty-Six costs essentially nothing per request. Full page builders sit at the other end — they add markup and often their own query layer to every uncached page, which is a real cost at checkout. The page builder comparison has the trade-offs in detail, and how to choose a WordPress theme covers the non-performance criteria.

Disclosure

I build and maintain Bloqra, a free block plugin (v1.5.4, 38 blocks, tested to WordPress 7.1.2), and this site runs on it. Judged by the same criterion as everything above, building with native blocks rather than a page builder keeps per-request cost low — but I am not going to pretend it has the track record of the alternatives: it sits at 10+ active installations against GeneratePress and Kadence’s years of deployment on large stores. If you are choosing the foundation for a store that already takes money, that history has real value and you should weigh it accordingly.

One more thing on stack cost: bulk email. If you send newsletters from the same server that runs your store, every send competes with your checkout for workers, and your transactional order emails share an IP reputation with your marketing. Send campaigns through an external provider and keep the store’s own mail on a dedicated relay — WordPress emails not sending and WooCommerce SMTP plugins compared cover the setup.

What to ask a host before you hand over a card

Send this to pre-sales. The answers, and how readily they come, tell you more than any review.

  • How many PHP workers or concurrent PHP processes does this plan get? If the answer is “unlimited”, ask what happens on the 30th simultaneous uncached request.
  • Is Redis or Memcached available on this plan, dedicated or shared, and with how much memory?
  • Are cart, checkout and My Account excluded from the page cache by default, and does the edge cache respect the WooCommerce session cookie?
  • Do I get system cron access, and at what interval? Can you run Action Scheduler via WP-CLI?
  • Is the database shared with other customers? Can I see the slow query log and add an index?
  • Do backups include the full database with the wp_wc_orders tables, how long is retention, and can I restore to staging myself?
  • Is any plugin I rely on on your blocklist? Ask specifically about your caching and backup plugins.
  • What does this renew at after the introductory term, and what does migration off look like?

That last one catches people every year. Introductory pricing on managed WordPress hosting frequently covers the first term only, and the renewal can be two or three times the signup rate. Budget on the renewal figure, and get it in writing before you migrate.

Whatever you choose, test the store properly after you move rather than clicking the homepage and calling it done — how to test your WordPress site after a major update works as a migration checklist too. Place a real test order, confirm the email arrives, and watch the scheduled actions queue drain.

Frequently asked questions about WooCommerce hosting requirements

What are the minimum WooCommerce hosting requirements in 2026?

Woo’s server requirements document asks for WordPress 6.9 or greater, PHP 8.3 or greater (tested to PHP 8.4), MySQL 8.0 or MariaDB 10.6 or greater, a memory limit of 256 MB or greater, and HTTPS. Note that the plugin header for WooCommerce 11.1.2 on wordpress.org still only enforces PHP 7.4, so the installer will let you run on a PHP version that lost security support in November 2022. Follow the documentation, not the installer. And treat all of these as a floor: for a store taking real orders I would start at 512 MB of PHP memory and at least 8 PHP workers.

How many PHP workers does a WooCommerce store need?

Work from orders per day rather than monthly traffic, because checkout concurrency is what saturates workers. My working figures: 4–6 workers up to about 10 orders a day, 8–12 for 10–100, 16–24 for 100–500, and 24 plus autoscaling above that. Nexcess, as one example of a host that publishes the number, allocates a minimum of 10 per site. The arithmetic that matters is your uncached page generation time divided into your worker count — at 400 ms per request, 10 workers handle roughly 25 uncached requests per second before a queue forms.

Can I run WooCommerce on shared hosting?

Yes, genuinely, up to roughly 10 orders a day and a few hundred products. Shared hosting is not a scam, it is a different product with undisclosed concurrency limits. The real problems are that you usually cannot find out what those limits are, a persistent object cache is often unavailable or shared across accounts, and cache exclusions for cart and checkout are rarely configured for you. That last one causes the “I can see someone else’s cart” bug. Below 10 orders a day the savings are rational; above it, the first busy day finds the ceiling for you.

How much RAM does a WooCommerce store need?

Two separate numbers get confused here. PHP’s per-process memory_limit should be 256 MB minimum and 512 MB on a store with a real extension set, because imports and reports spike far above what a product page needs. Server RAM is different: it has to hold your workers (each one consuming up to that limit under load), plus the database buffer pool, plus Redis. That is why 2 GB suits a launching store and a busy one wants 8 GB. The test for whether you need more server RAM is whether your database comfortably fits in the buffer pool — if it does not, MySQL hits disk and extra workers will not help.

Do I really need Redis for WooCommerce?

Above roughly 10 orders a day or a few thousand products, a persistent object cache is the cheapest meaningful upgrade available, and it is usually already included on managed hosting. Without one, WordPress rebuilds its object cache from the database on every request. The important caveat: the Redis Object Cache plugin (v3.0.0, 500,000+ installs, requires PHP 7.2+) is a client, not a cache — it needs a Redis server to connect to. Run wp eval 'echo wp_using_ext_object_cache();' and check php -m | grep redis before installing anything. If there is no Redis on the server, this is a conversation with your host.

Why is my store slow when my host says the cache hit ratio is 95%?

Most likely because extensions are starting WooCommerce sessions for visitors who have an empty cart. The session cookie makes the page cache bypass correctly, so those visitors consume a PHP worker on every page, and whole-site hit ratios hide it because your cached homepage and static assets dominate the average. WooCommerce 10.3 added an experimental setting, “Clear Customer Sessions When Empty”, which runs late on template_redirect (priority 999) and drops the session and cookie when both the cart and session are genuinely empty. It is off by default and still experimental, so enable it on staging with your real extension set first.

Will moving to better hosting fix my slow WooCommerce store?

Roughly half the time. Measure first: run curl -w "%{time_starttransfer}" against a product page with a cache-busting query string. Under 400 ms and your hosting is fine, so the problem is elsewhere. Over two seconds and you have a code or query problem that faster hardware will only make more expensive. Install Query Monitor on staging and look at query count and time per plugin — one extension generating hundreds of queries on a category page is a far more common cause than insufficient hardware, and fixing it is free.

Does my backup actually contain my WooCommerce orders?

Check, because this one bites hard. Since WooCommerce 8.2 (October 2023), High-Performance Order Storage is the default for new installs and orders live in wp_wc_orders, wp_wc_order_addresses, wp_wc_order_operational_data and wp_wc_orders_meta rather than in wp_posts. Any tool that predates HPOS or exports from the post tables will produce a backup that looks complete and contains zero orders. The only real verification is restoring to staging and counting rows — not a green tick in a dashboard.

Where to start

If you do one thing after reading this, time an uncached product page. That single number tells you whether you have a hosting problem or a code problem, and it stops you from buying the wrong fix. Then check whether you have a persistent object cache and whether your cron is real. Those three checks cost nothing and resolve most “my store is slow” cases before any money changes hands.

Leave a Reply to This Post