PHP Concurrency Options
Also Known As
PHP Fibers
pcntl_fork
ReactPHP
PHP async
Swoole
TL;DR
PHP's concurrency toolkit — Fibers for cooperative multitasking, pcntl for process forking, pthreads for true threading (CLI only), and async frameworks (ReactPHP, Amp).
Explanation
PHP concurrency options: (1) Fibers (PHP 8.1) — cooperative multitasking within a single thread, enables async/await patterns; (2) pcntl_fork() — true process forking for CPU-bound parallel work, each fork has its own memory; (3) parallel extension — true threads with shared memory (CLI only, experimental); (4) ReactPHP / Amp / Swoole — event loop frameworks that manage non-blocking I/O over Fibers or traditional callbacks; (5) PHP-FPM multiple workers — the standard PHP concurrency model — each request in a separate worker process. True parallelism in PHP requires multiple processes or Swoole's coroutines.
Common Misconception
✗ PHP cannot do concurrent programming — PHP has multiple concurrency models; the lack of threading in PHP-FPM is a feature (no shared state, no race conditions) — concurrency happens at the process level.
Why It Matters
A PHP CLI script that makes 100 external API calls sequentially takes 100 seconds — using ReactPHP or Fibers with async HTTP, all 100 calls run concurrently and complete in ~1 second.
Common Mistakes
- Fibers for CPU-bound work — Fibers are cooperative concurrency for I/O, not parallel CPU execution.
- pcntl_fork() in web requests — forking in FPM creates orphan processes and database connection issues.
- Not handling child process exit in pcntl_fork() — zombie processes accumulate.
- Using Swoole without testing all dependencies for coroutine compatibility.
Code Examples
✗ Vulnerable
// Sequential HTTP requests — 10 * 1 second = 10 seconds total:
$results = [];
foreach ($urls as $url) {
$results[] = file_get_contents($url); // Blocks for each URL
}
// Total time: N * latency per request
✓ Fixed
// ReactPHP concurrent HTTP — all requests in parallel:
use React\Http\Browser;
use React\EventLoop\Loop;
$browser = new Browser();
$promises = [];
foreach ($urls as $url) {
$promises[] = $browser->get($url); // Non-blocking
}
// Wait for all to complete:
\React\Promise\all($promises)->then(function(array $responses) {
foreach ($responses as $response) {
echo $response->getBody();
}
});
Loop::run(); // Total time: ~1 * max(individual latencies)
References
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
16 Mar 2026
Edited
22 Mar 2026
Views
32
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
No pings yesterday
Perplexity 10
Amazonbot 7
Unknown AI 2
Ahrefs 2
Google 1
ChatGPT 1
Also referenced
How they use it
crawler 23
Related categories
⚡
DEV INTEL
Tools & Severity
🟡 Medium
⚙ Fix effort: High
⚡ Quick Fix
For most web apps: more PHP-FPM workers + Redis caching. For high concurrency I/O: RoadRunner or Swoole. For CPU parallelism: separate queue workers with pcntl
📦 Applies To
PHP 7.0+
web
cli
queue-worker
🔗 Prerequisites
🔍 Detection Hints
PHP making 10+ sequential HTTP calls where concurrency would reduce latency; CPU-bound work blocking FPM workers
Auto-detectable:
✗ No
blackfire
datadog
⚠ Related Problems
🤖 AI Agent
Confidence: Low
False Positives: High
✗ Manual fix
Fix: High
Context: File
Tests: Update