drewlabs / async
Provides utility function for async programming in PHP
Requires
- php: >=7.2
Requires (Dev)
- phpunit/phpunit: >=6.0
README
The async
library provides a list of utility functions to doing basic async programming in PHP language. It makes use of PHP Generator
to implement a co-routine platform on top of which async tasks are executed.
Usage
The library provides the following utility functions:
- async
async(callable $waitFn)
The async
utility provides an asynchronous function execution context for the subroutine passed as argument.
It returns a Awaitable
instance which start the subroutine when wait()
is invoked on it. The wait()
statement as it will pause the script execution until the subroutine complete.
<?php $promise = async(function () { printf("Calling coroutine...\n"); usleep(1000 * 2000); return 'awaited'; }); $promise->then(function($value) { printf("%s...", $value); // awaited... });
-
promise
promise(callable $waitFn, bool $shutdown = false)
promise
provides a factory function that create promise A+ specification instance. It takes a waitable function with a reference to therevolve
function as first param and a reference to thereject
function of the promise instance as second parameter.$promise = promise(function($resolve, $reject) { // Do something with resolve usleep(1000*1000); // Block PHP execution resolve("I have been waited for 1 second."); }); // Wait for the promise $promise->wait();
Note In the above example, without calling
wait()
, the promise coroutine to execute, does not run. To create a promise that automatically run on PHP process shutdown, the factory function takes a second boolean flag as parameter.// Here the script create a promise instance that executes when // PHP process shutdown with success $promise = promise(function($resolve, $reject) { // Do something with resolve usleep(1000*1000); // Block PHP execution resolve("I have been waited for 1 second."); }, true);
-
defer
defer(callable $waitFn)
defer
creates a promise instance that executes resolve and reject callbacks when onPHP
process shutdown. It's the simply version ofpromise($waitFn, true)
// Here the script create a promise instance that executes when // PHP process shutdown with success $promise = defer(function($resolve, $reject) { // Do something with resolve usleep(1000*1000); // Block PHP execution resolve("I have been waited for 1 second."); });
- join
join(...$waitFn)
join
, is same as async
interface, except the fact that is takes a list of subroutines wait on the result of those subroutines and return the a list of the awaited result in the order they were inserted.
$promise = join( function () { printf("Calling coroutine...\n"); yield usleep(1000*2000); // blocking return'awaited'; }, function () { printf("Calling second coroutine...\n"); yield usleep(1000*2000); // blocking return'awaited 2'; }, ); $promise->then(function($value) { print_r($value); // ['awaited', 'awaited 2'] }); // ... // Start the async routine $promise->wait();
-
await & all
await($coroutine) / all(array $coroutines)
These are utility function for waiting onasync
andjoin
subroutines respectively.$promise = async(function () { yield usleep(1000 * 500); return 2; }); // ... // Awaiting the coroutine $result = await($promise); printf("%d\n", $result); // 2 // Developpers can directly call / await on a given subroutine $result2 = await(function () { yield usleep(1000 * 500); return 2; }); printf("%d\n", $result2); // 2
all
works the same asawait
except that is takes an array of promises or subroutines and returns an array of resolved values.