Fiber-Based Task Scheduler
Also Known As
Fibers
coroutine scheduler
cooperative multitasking
async PHP
TL;DR
Building a cooperative multitasking scheduler with PHP Fibers — suspending and resuming tasks at I/O wait points to run multiple tasks concurrently in a single thread.
Explanation
PHP Fibers (8.1) are stackful coroutines — a Fiber can suspend itself with Fiber::suspend(), returning control to the caller, and be resumed later with $fiber->resume(). A scheduler maintains a queue of Fibers and runs each until it suspends or completes. Combined with non-blocking I/O (event loops like ReactPHP/Revolt), this enables genuine concurrent I/O in a single PHP thread. This is the foundation of async PHP frameworks and how libraries like Amp v3 implement their concurrency model.
Common Misconception
✗ PHP Fibers provide parallel execution — Fibers are cooperative (not preemptive) and single-threaded; they enable concurrency (interleaved I/O) not parallelism (simultaneous CPU execution).
Why It Matters
Understanding how Fiber-based schedulers work explains how ReactPHP, Amp, and Swoole achieve high concurrency without threads — essential for writing correct async PHP code.
Common Mistakes
- Blocking I/O inside a Fiber — blocks the entire scheduler, defeating concurrency.
- Not calling Fiber::suspend() when waiting for I/O — the Fiber monopolises the scheduler.
- Creating Fibers for CPU-bound work — they share the same thread; use separate processes instead.
- Not handling Fiber exceptions — uncaught exceptions in a Fiber terminate it silently.
Code Examples
✗ Vulnerable
// Blocking I/O inside Fiber — no concurrency gained:
$fiber = new Fiber(function(): void {
$data = file_get_contents('https://api.example.com/data'); // BLOCKS!
Fiber::suspend($data); // Too late — already waited synchronously
});
✓ Fixed
// Cooperative scheduler with non-blocking I/O:
$scheduler = new SplQueue();
$addTask = function(Fiber $fiber) use ($scheduler) {
$scheduler->enqueue($fiber);
};
// Run scheduler:
while (!$scheduler->isEmpty()) {
$fiber = $scheduler->dequeue();
if (!$fiber->isStarted()) $fiber->start();
elseif ($fiber->isSuspended()) $fiber->resume();
if ($fiber->isSuspended()) $scheduler->enqueue($fiber); // Re-queue
}
// Task: suspend at I/O point, resume when ready:
$task = new Fiber(function() use ($loop): void {
$promise = $loop->httpGet('https://api.example.com');
$data = Fiber::suspend($promise); // Suspend — scheduler runs other tasks
echo $data;
});
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
16 Mar 2026
Edited
22 Mar 2026
Views
34
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
Perplexity 1
Perplexity 8
Amazonbot 7
ChatGPT 6
Google 5
Unknown AI 2
Ahrefs 2
Also referenced
How they use it
crawler 25
crawler_json 5
Related categories
⚡
DEV INTEL
Tools & Severity
🔵 Info
⚙ Fix effort: High
⚡ Quick Fix
Use Amp v3 or ReactPHP which include a Fiber-based scheduler — writing your own scheduler is complex; use the framework's event loop abstraction
📦 Applies To
PHP 8.1+
cli
queue-worker
🔍 Detection Hints
Manual Fiber::suspend/resume coordination without event loop abstraction
Auto-detectable:
✗ No
⚠ Related Problems
🤖 AI Agent
Confidence: Low
False Positives: Medium
✗ Manual fix
Fix: High
Context: File
Tests: Update