1. Go to this page and download the library: Download fast-forward/fork 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/ */
fast-forward / fork example snippets
declare(strict_types=1);
use FastForward\Fork\Manager\ForkManager;
use FastForward\Fork\Worker\WorkerInterface;
$manager = new ForkManager();
$group = $manager->fork(
static function (WorkerInterface $worker): int {
echo sprintf("worker %d started\n", $worker->getPid());
usleep(150_000);
echo sprintf("worker %d finished\n", $worker->getPid());
return 0;
},
3,
);
$group->wait();
foreach ($group as $worker) {
printf(
"pid=%d exit=%s signal=%s\n",
$worker->getPid(),
var_export($worker->getExitCode(), true),
$worker->getTerminationSignal()?->name ?? 'none',
);
}
declare(strict_types=1);
use FastForward\Fork\Manager\ForkManager;
use FastForward\Fork\Worker\WorkerInterface;
$manager = new ForkManager();
$apiWorkers = $manager->fork(
static fn (WorkerInterface $worker): int => 0,
2,
);
$queueWorkers = $manager->fork(
static fn (WorkerInterface $worker): int => 0,
2,
);
// Waits for every worker created by this manager.
$manager->wait();
declare(strict_types=1);
use FastForward\Fork\Manager\ForkManager;
use FastForward\Fork\Worker\WorkerInterface;
$manager = new ForkManager();
$group = $manager->fork(
static function (WorkerInterface $worker): int {
echo sprintf("worker %d step 1\n", $worker->getPid());
usleep(250_000);
echo sprintf("worker %d step 2\n", $worker->getPid());
return 0;
},
2,
);
foreach ($group->all() as $worker) {
echo $worker->getOutput();
}
$group->wait();
declare(strict_types=1);
use FastForward\Fork\Manager\ForkManager;
use FastForward\Fork\Signal\Signal;
use FastForward\Fork\Worker\WorkerInterface;
$manager = new ForkManager();
$group = $manager->fork(
static function (WorkerInterface $worker): never {
while (true) {
echo sprintf("worker %d heartbeat\n", $worker->getPid());
usleep(100_000);
}
},
2,
);
$group->kill(Signal::Terminate);
$group->wait();
declare(strict_types=1);
use FastForward\Fork\Manager\ForkManager;
use FastForward\Fork\Signal\DefaultSignalHandler;
use FastForward\Fork\Signal\Signal;
$manager = new ForkManager(
signalHandler: new DefaultSignalHandler(exitOnSignal: false),
);
// Later, in the master process:
posix_kill($manager->getMasterPid(), Signal::Terminate->value);
declare(strict_types=1);
use FastForward\Fork\Manager\ForkManager;
use FastForward\Fork\Manager\ForkManagerInterface;
use FastForward\Fork\Signal\Signal;
use FastForward\Fork\Signal\SignalHandlerInterface;
final class GracefulReloadHandler implements SignalHandlerInterface
{
public function signals(): array
{
return [Signal::User1];
}
public function __invoke(ForkManagerInterface $manager, Signal $signal): void
{
$manager->kill(Signal::Terminate);
$manager->wait();
}
}
$manager = new ForkManager(signalHandler: new GracefulReloadHandler());