What a PHP worker is
Kinsta defines a thread as 'a PHP process that handles one incoming request at a time' and notes threads were previously called PHP workers. WP Engine says each uncached page request is handled by a PHP worker and compares workers to cashiers handling one transaction each. On a server you manage, PHP-FPM's pm.max_children 'sets the limit on the number of simultaneous requests that will be served'.
Cached pages do not use workers. WP Engine states that only uncached traffic can receive a 504, because cached requests do not queue for PHP workers. That is why a sales page survives a traffic spike while the student dashboard does not.
Why course traffic is mostly uncached
Hosts deliberately skip the cache for logged-in users. Kinsta's edge caching says anywhere a user is logged in bypasses caching. WP Engine's page cache excludes pages where a cookie containing 'wordpress_' has a value set, along with wp-admin and wp-login.php. SiteGround's CDN reports BYPASS when you are logged in.
For a course site this means the pages students use most (lessons, quizzes, progress, certificates, account pages) each need a worker, plus AJAX calls that LMS and membership plugins make in the background. WP Engine lists ad plugins that hit admin-ajax.php among the plugins that tend to overwhelm PHP workers.
What each host documents
| Host | What is published | How to get more |
|---|---|---|
| Kinsta | Threads per site drawn from a memory pool; WP 5 allows up to 4 threads; a 1GB pool can run 4 threads at 256MB or 8 at 128MB; standard staging is capped at 2 threads | PHP performance add-on: $10 per additional 500MB a month; re-split the pool into more threads |
| WP Engine | Queue behaviour: separate priority queues per account and traffic type, human traffic highest; requests over 60 seconds are cut off; page cache 600 seconds by default | Improve cacheability, block abusive traffic, or move to a larger server with more workers |
| SiteGround | No worker count on the shared plan page | Ask support for the limit on your plan before a cohort launch |
| DigitalOcean Droplet | Nothing fixed; you choose pm (static, dynamic, ondemand) and pm.max_children in PHP-FPM | Raise max_children within RAM and CPU, or resize the Droplet |
How a queue turns into errors
WP Engine's 504 article describes the sequence: when workers cannot finish requests as fast as they arrive, a backlog forms; when the workers and backlog are both full, the oldest waiting request is evicted and that visitor sees a 504. Requests running longer than 60 seconds are terminated and show as 502s, and both errors together mean too many long requests at once.
Its prioritisation article adds that bots, AJAX and XMLRPC see errors well before real users because they sit in lower-priority queues. A student whose quiz autosave fails silently may be the first symptom, before anyone reports a 504.
On your own server, PHP-FPM's listen.backlog defaults to 511 on Linux, and request_terminate_timeout defaults to 0 (off), so a stuck request can hold a worker indefinitely unless you set a timeout.
Worked example: 300 students finishing a quiz at a deadline
Hypothetical cohort: 300 students submit a timed quiz in the same two-minute window. Each submission triggers about 3 uncached requests (the submit, the results page and a progress AJAX call): 900 requests in 120 seconds is 7.5 requests per second.
Busy workers = arrival rate x average time per request. If the LMS answers in 0.4 seconds, 7.5 x 0.4 = 3 workers busy on average. Arrivals bunch in the final seconds, so plan for at least double: 6 workers. A plan with 4 threads will queue during the peak.
If a slow quiz-statistics query raises average time to 1.2 seconds, 7.5 x 1.2 = 9 busy on average and 18 at a doubled peak. More workers alone will not fix that; profile the query or add an object cache first.
On Kinsta, 8 threads at 256MB each need a 2GB pool. If your plan's default pool is 1GB, adding 1GB costs 2 x $10 = $20 a month. Alternatively, 8 threads at 128MB fit in 1GB, but Kinsta warns that more threads means less memory per thread, so test the quiz page's memory use on staging first. Standard staging is limited to 2 threads, so load-test the live configuration carefully or during a quiet window.
Before buying more workers
- Measure average PHP time for your busiest logged-in page; the arithmetic above is only as good as that number.
- Find AJAX calls that fire on every lesson view and cache or remove them where possible.
- Stagger deadlines across time zones or groups so 300 submissions are not in the same two minutes.
- Add a persistent object cache if your host offers one, to shorten each request.
- Keep video and large downloads off the web server so workers are not tied up serving files.
- On a VPS, set pm.max_children from measured memory per PHP process and available RAM after the database, and set request_terminate_timeout.
Questions before you decide
Are PHP workers and PHP threads the same thing?
In hosting documentation, yes. Kinsta renamed workers to threads; each handles one request at a time, as WP Engine's workers and PHP-FPM's child processes do.
Will more workers make my site faster?
Only if requests are waiting in a queue. If each request is slow, more workers serve more students at the same slow speed and may use more memory. Fix slow queries first, then size workers for the peak.
Why do errors appear during a cohort start but not during a marketing launch?
Marketing visitors are mostly served from the page cache. Logged-in students bypass it, so every click needs a PHP worker.
Sources & verification
Product details and prices can change. Check the linked provider before buying.
- Kinsta: PHP performance (threads and memory pool) Accessed 29 Oct 2026
- Kinsta: Billing for WordPress hosting plans Accessed 29 Oct 2026
- Kinsta: Edge caching Accessed 29 Oct 2026
- WP Engine: PHP workers and request prioritization Accessed 29 Oct 2026
- WP Engine: Fix 504 gateway timeout errors Accessed 29 Oct 2026
- WP Engine: Server and browser caching Accessed 29 Oct 2026
- SiteGround: Web hosting plans Accessed 29 Oct 2026
- SiteGround KB: SiteGround CDN configuration, headers and purging Accessed 29 Oct 2026
- PHP manual: FPM configuration Accessed 29 Oct 2026
- DigitalOcean: Droplet pricing Accessed 29 Oct 2026
Sources link directly to providers. Product buttons may use separately labeled affiliate links. Read our disclosure.