-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path09-default-signal-handler.php
More file actions
71 lines (56 loc) · 2.05 KB
/
09-default-signal-handler.php
File metadata and controls
71 lines (56 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
declare(strict_types=1);
/**
* This file is part of fast-forward/fork.
*
* This source file is subject to the license bundled
* with this source code in the file LICENSE.
*
* @copyright Copyright (c) 2026 Felipe Sayão Lobato Abreu <github@mentordosnerds.com>
* @license https://opensource.org/licenses/MIT MIT License
*
* @see https://github.com/php-fast-forward/fork
* @see https://github.com/php-fast-forward
* @see https://datatracker.ietf.org/doc/html/rfc2119
*/
use FastForward\Fork\Examples\Support\ExampleConsole;
use FastForward\Fork\Examples\Support\ExampleRuntime;
use FastForward\Fork\Manager\ForkManager;
use FastForward\Fork\Signal\DefaultSignalHandler;
use FastForward\Fork\Signal\Signal;
use FastForward\Fork\Worker\WorkerInterface;
require __DIR__ . '/bootstrap.php';
$console = new ExampleConsole();
$console->title(
'09 Default signal handler',
'Send a signal to the master process and let DefaultSignalHandler propagate it to every worker.',
);
$manager = new ForkManager(signalHandler: new DefaultSignalHandler(exitOnSignal: false));
$group = $manager->fork(
static function (WorkerInterface $worker): int {
echo sprintf("worker %d ready\n", $worker->getPid());
while (true) {
echo sprintf("worker %d heartbeat\n", $worker->getPid());
usleep(150_000);
}
},
2,
);
$workersReady = ExampleRuntime::waitUntil(
static function () use ($group): bool {
foreach ($group->all() as $worker) {
if (! str_contains($worker->getOutput(), 'ready')) {
return false;
}
}
return true;
},
timeoutSeconds: 1.0,
);
if (! $workersReady) {
throw new RuntimeException('Expected the workers to become ready before signaling the master.');
}
$console->line(sprintf('Master PID: %d', $manager->getMasterPid()));
$console->line('Sending SIGTERM to the master process.');
posix_kill($manager->getMasterPid(), Signal::Terminate->value);
$console->printGroup('Workers after signal propagation', $group);