Hi, All, The generator has been introduced in PHP 5.5. And we can it pause a function execution. With these feature, we can schedule multi io task in userland without blocking.
More details can be found at [Nikic]. And there is also some asynchronous frameworks like [AMP], which allow programer to code like blocking, but run asynchronously. However, like python's generator, lua's coroutine, javascript's async/await, php's generator also is a stackless coroutine implementation. We cannot pause a function call in it's sub function call. This is the reason that frameworks like [AMP] has many wrapper, is hard to understand, and almost impossible to be used to implement real but complex system. So I propose to introduce the sackful coroutine, aka Fiber, support for PHP. And the possible API like this, > <?php > function foo($a) > { > $b = await $a + 1; > echo $b; > } > > function bar() > { > foo(); > } > > $f = new Fiber(function($a) { > bar($a); > return 3; > }); > > $c = $f->resume(1); > // 1 will be passed to lambda, then bar > // bar call foo, and the **await** in foo paused this execution > // and make the return value of resume as $a + 1 > // so $c is 2 > > $c = $f->resume(3); > // resume the execution by previous await, and the $b in foo > // will be assigned a value of 3 > // so foo echo 3 and return and then the lambda return > // and the resume got a return value of 3. so $c is 3. So the Fiber API is a little like the Generator API, but is more simple yet powerful. So there is no need to distinct $generator->current(), $generator->send(), and $generator->getReturn(). I made a more complex example at [FIREPHP].And I also make a [PR] for comment. All comment are welcome. Thanks. [Nikic] https://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html [AMP] http://amphp.org/ [FIREPHP] https://github.com/fiberphp/fiber-core/blob/master/app.php [PR] https://github.com/php/php-src/pull/2723 -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php