1. Go to this page and download the library: Download symplely/spawn library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
symplely / spawn example snippets
use Async\Spawn\Spawn;
// Shows output by default and Channel instance is extracted from args.
$future = \parallel($function, ...$args)
// Shows output by default, turns on yield usage, can nel)
// Or Show output by default and channel instance has to be explicitly passed in.
$future = \spawning($function, $timeout, $channel)
// Or
$future = Spawn::create(function () use ($thing) {
// Do a thing
}, $timeout, $channel)
->then(function ($output) {
// Handle success
})->catch(function (\Throwable $exception) {
// Handle exception
});
// Wait for `Future` to terminate. Note this should only be executed for local testing only.
// Use "How to integrate into your project/package" section instead.
// Second option can be used to set to display child output, default is false
\spawn_run($future, true);
// Or same as
$future->displayOn()->run();
// Or
$future->run();
use Async\Spawn\Channeled as Channel;
$channel = Channel::make("io");
// Shows output by default and Channel instance is extracted for args.
$future = parallel(function ($channel) {
$channel = Channel::open($channel);
for ($count = 0; $count <= 10; $count++) {
$channel->send($count);
}
echo 'pingpangpong';
$channel->send(false);
return 'return whatever';
}, (string) $channel);
while (($value = $channel->recv()) !== false) {
var_dump($value);
}
echo \spawn_output($future); // pingpangpong
// Or
echo \spawn_result($future); // return whatever
// Or
echo $future->getResult(); // return whatever
// Shows output by default and Channel instance is extracted for args.
$future = parallel($function, ...$args)
// Or
$future = spawn($function, $timeout, $channel)
// Or
$future = Spawn::create(function () {
// The second argument is optional, Defaults no timeout,
// it sets The maximum amount of time a process may take to finish in seconds
// The third is the Channel instance pass to Future subprocess.
return `whatever`|Object|Closure|; // `whatever` will be encoded, then decoded by parent.
}, int $timeout = 0 , $input = null)
->then(function ($result) {
// On success, `$result` is returned by the process.
})
->catch(function ($exception) {
// When an exception is thrown from within a process, it's caught and passed here.
})
->timeout(function () {
// When an timeout is reached, it's caught and passed here.
})
->progress(function ($type, $data) {
// Live progressing of output: `$type, $data` is returned by the Future process.
// $type is `ERR` for stderr, or `OUT` for stdout.
})
->signal($signal, function ($signal) {
// The process will be sent termination `signal` and stopped.
// When an signal is triggered, it's caught and passed here.
// This feature is only available using `libuv`.
});
->then(function ($result) {
// On success, `$result` is returned by the Future process or callable you passed.
//
}, function ($catchException) {
//
}, function ($progressOutput) {
//
}
);
// To turn on displaying of child output.
->displayOn();
// Stop displaying child output.
->displayOff();
// A `Future` process can be retried.
->restart();
// Wait for `Future` to terminate. Note this should only be executed for local testing only.
// Use "How to integrate into your project/package" section instead.
->run();
use Async\Spawn\Parallel;
$parallel = new Parallel();
foreach ($things as $thing) {
// the second argument `optional`, can set the maximum amount of time a process may take to finish in seconds.
$parallel->add(function () use ($thing) {
// Do a thing
}, $optional)->then(function ($output) {
// Handle success
// On success, `$output` is returned by the process or callable you passed to the queue.
})->catch(function (\Throwable $exception) {
// Handle exception
// When an exception is thrown from within a process, it's caught and passed here.
});
}
// Wait for Parallel `Future` Pool to terminate. Note this should only be executed for local testing only.
// Use "How to integrate into your project/package" section instead.
$parallel->wait();
use Async\Spawn\Parallel;
$parallel = (new Parallel())
// The maximum amount of processes which can run simultaneously.
->concurrency(20)
// Configure how long the loop should sleep before re-checking the process statuses in milliseconds.
->sleepTime(50000);
use Async\Spawn\Parallel;
use Async\Spawn\FutureHandler;
use Async\Spawn\FutureInterface;
use Async\Spawn\ParallelInterface;
class setupLoop
{
/**
* @var Parallel
*/
protected $parallel;
/**
* @var FutureHandler
*/
protected $future = null;
public function __construct() {
$this->parallel = new Parallel($this);
$this->future = $this->parallel->getFutureHandler();
}
public function addFuture($callable, int $timeout = 0, bool $display = false, $channel = null): FutureInterface {
$future = $this->parallel->add($callable, $timeout, $channel);
return $display ? $future->displayOn() : $future;
}
public function getParallel(): ParallelInterface {
return $this->parallel;
}
/**
* Check for pending I/O events, signals, futures, streams/sockets/fd activity, timers or etc...
*/
protected function hasEvents(): bool {
return !$this->future->isEmpty() || !$this->ActionEventsCheckers->isEmpty();
}
public function runLoop() {
while ($this->hasEvents()) {
$this->future->processing();
if ($this->waitForAction());
$this->DoEventActions();
}
}
public function executeTask($event, $parameters = null) {
$this->DoEventActions($event, $parameters);
// Or just
// if (\is_callable($event))
// $event($parameters);
}
public function isPcntl(): bool {}
}
// functions.php
if (!\function_exists('___marker')) {
//
// All additional extra functions needed in a `Future` process...
//
function ___marker()
{
return true;
}
}