What if your program could juggle many tasks like a skilled chef managing multiple dishes at once?
Why Fibers for concurrency in PHP? - Purpose & Use Cases
Imagine you have to cook multiple dishes at the same time for a dinner party, but you only have one stove and one set of hands. You try to finish one dish completely before starting the next, which makes the whole process very slow.
Doing tasks one after another means waiting a lot. If one dish needs to simmer or bake, you just stand there doing nothing. This wastes time and can cause mistakes, like forgetting to check the oven or burning food.
Fibers let you pause one task and switch to another, like juggling cooking steps. You can start simmering one dish, then switch to chopping vegetables for another, and come back later. This way, you use your time efficiently without waiting idle.
$result1 = task1();
$result2 = task2();
// tasks run one after another, waiting for each to finish$fiber1 = new Fiber(fn() => task1());
$fiber2 = new Fiber(fn() => task2());
$fiber1->start();
$fiber2->start();
// tasks can pause and resume, running concurrentlyFibers make it easy to write programs that do many things at once without getting stuck waiting.
When a website loads images and data from different places, fibers let it start showing some content while still loading others, making the page feel faster.
Manual sequential tasks waste time waiting.
Fibers let you pause and switch tasks smoothly.
This improves efficiency and responsiveness in programs.
Practice
Fiber in PHP?Solution
Step 1: Understand Fiber's role
Fibers allow pausing and resuming code blocks, enabling concurrency without threads.Step 2: Compare options
Only To pause and resume code execution for concurrency correctly describes Fibers' purpose; others describe unrelated features.Final Answer:
To pause and resume code execution for concurrency -> Option CQuick Check:
Fibers = pause and resume concurrency [OK]
- Thinking Fibers create real threads
- Assuming Fibers speed up database automatically
- Confusing Fibers with async loops
Solution
Step 1: Recall Fiber methods
The Fiber class usesstart()to begin execution.Step 2: Check other options
Methods likerun(),begin(), andexecute()do not exist for Fiber.Final Answer:
$fiber->start(); -> Option DQuick Check:
Fiber starts with start() method [OK]
- Using run() instead of start()
- Trying to call execute() or begin()
- Confusing Fiber methods with thread methods
$fiber = new Fiber(function(): void {
$value = Fiber::suspend('paused');
echo "Resumed with: $value";
});
echo $fiber->start();
$fiber->resume('data');Solution
Step 1: Analyze Fiber start()
Thestart()runs untilFiber::suspend('paused'), which returns 'paused'. So, echo outputs 'paused'.Step 2: Analyze Fiber resume()
Theresume('data')continues after suspend, echoing "Resumed with: data".Final Answer:
pausedResumed with: data -> Option AQuick Check:
start() returns suspend value, resume() continues [OK]
- Assuming start() returns void
- Thinking resume() returns suspend value
- Mixing order of output strings
$fiber = new Fiber(function() {
echo "Start\n";
Fiber::suspend();
echo "End\n";
});
$fiber->resume();Solution
Step 1: Check Fiber start method usage
Fibers must be started withstart()before callingresume().Step 2: Validate other options
CallingFiber::suspend()without value is allowed; no return type needed; echo is valid inside Fiber.Final Answer:
Fiber must be started with start(), not resume() first -> Option BQuick Check:
start() first, then resume() [OK]
- Calling resume() before start()
- Thinking suspend() needs a value
- Expecting Fiber function to require return type
$fiber1 = new Fiber(function() {
for ($i = 0; $i < 3; $i++) {
echo "A$i ";
Fiber::suspend();
}
});
$fiber2 = new Fiber(function() {
for ($i = 0; $i < 3; $i++) {
echo "B$i ";
Fiber::suspend();
}
});
// Which code below correctly alternates execution?
A) {
$fiber1->start();
$fiber2->start();
$fiber1->resume();
$fiber2->resume();
}
B) {
$fiber1->start();
$fiber1->resume();
$fiber2->start();
$fiber2->resume();
}
C) {
$fiber1->start();
$fiber2->start();
$fiber2->resume();
$fiber1->resume();
}
D) {
$fiber1->start();
$fiber2->start();
$fiber1->resume();
$fiber1->resume();
}Solution
Step 1: Understand Fiber suspension
Each Fiber suspends after printing one message, so to alternate, we must resume them in turn.Step 2: Analyze options for alternating resumes
Start both fibers, then alternate resume calls: fiber1->resume(), fiber2->resume() starts both fibers, then resumes fiber1 and fiber2 alternately, producing alternating output. Others resume one fiber multiple times or in wrong order.Final Answer:
Start both fibers, then alternate resume calls: fiber1->resume(), fiber2->resume() -> Option AQuick Check:
Alternate resume calls for concurrency [OK]
- Resuming one fiber multiple times before the other
- Starting fibers but not resuming correctly
- Resuming fibers in wrong order
Ready to prove it?
Pass the test and this pattern moves unknown
