This is an old revision of the document!
PHP RFC: Fiber
- Version: 0.1
- Date: 2017-09-13
- Author: Haitao Lv, i@lvht.net
- Status: Draft
- First Published at: http://wiki.php.net/rfc/fiber
Introduction
Fibers are primitives for implementing light weight cooperative concurrency in PHP. Basically they are a means of creating Closure that can be paused and resumed. The scheduling of fiber must be done by the programmer and not the VM.
As opposed to Generator (a stackless light weight concurrency implementation), each fiber comes with a stack. This enables the fiber to be paused from deeply nested function calls within the fiber block.
When a fiber is created it will not run automatically. Rather it must be explicitly asked to run using the Fiber::resume method. The code running inside the fiber can give up control by calling Fiber::yield in which case it yields control back to caller (the caller of the Fiber::resume).
Proposal
Why not make it as a Extension?
How to deal with internal calls?
Implementation
final class Fiber { public const STATUS_SUSPENDED = 1; public const STATUS_RUNNING = 2; public const STATUS_FINISHED = 3; public const STATUS_DEAD = 4; public function __construct(Closure $closure) {} public static function yield($arg1) {} public function resume($arg1...) {} /** @throws \UnexpectedValueException */ public function __wakeup(): void {} /** @throws \Error */ private function __clone() {} }
function sub1() { return Fiber::yield(1); } $fiber = new Fiber(function ($a, $b) { $c = Fiber::yield($a + $b); $d = sub1(); return $d.$c; }); echo $fiber->resume(1, 2); // echo 3 echo $fiber->resume("world"); // echo 1 echo $fiber->resume("hello "); // echo "hello world"
Backward Incompatible Changes
“Fiber” are now globally defined classes, which might collide with user defined classes of the same name in the global namespace. However, the risk of the introduction of them is considered to be very low, since the global namespace should not be used by PHP users.
Proposed PHP Version(s)
7.3
RFC Impact
To SAPIs
None
To Existing Extensions
None
To Opcache
None
New Constants
None
php.ini Defaults
None
Open Issues
Make sure there are no open issues when the vote starts!
Unaffected PHP Functionality
None
Future Scope
This sections details areas where the feature might be improved in future, but that are not currently proposed in this RFC.
Proposed Voting Choices
Simple 50%+1 majority vote.
Patches and Tests
Implementation
After the project is implemented, this section should contain
- the version(s) it was merged to
- a link to the git commit(s)
- a link to the PHP manual entry for the feature
- a link to the language specification section (if any)
References
Rejected Features
Keep this updated with features that were discussed on the mail lists.