3v4l.org

run code in 300+ PHP versions simultaneously
<?php // Calling it supervisor because it maintains an internal state, // Receiver because it receives messages. $supervisor = makeReceiver(); // ...(243) The internal id, optional // Now we're messaging into that state. Here, we're passing commands. $supervisor->send(['addUser','amy']); $supervisor->send(['addUser','bob']); $supervisor->send(['addUser','ellen']); $supervisor->send(['addUser','joe']); $supervisor->send(['addUser','mark']); $supervisor->send(['addUser','janice']); // Nope $supervisor->send(['addUser','franke']); // Sorry, too many // This is a pointer to what's been yielded in the generator. // It is now an Iterator (next, rewind). $users = $supervisor->send(_m('iterator')); function _m($message) { return [$message, null]; } foreach($users as $user) { echo "User is `$user`.".PHP_EOL; } // This tells it to hari-kari. var_dump($supervisor->send(['SIGHUP', $supervisor])); $supervisor2 = makeReceiver(null, ['eduardo','paul','simon',]); $supervisor2->send(['addUser','ellen']); $supervisor2->send(['addUser','joe']); $users2 = $supervisor2->send(_m('iterator')); foreach($users2 as $user2) { echo "User2 is `$user2`.".PHP_EOL; } // Walk the plank, aargh! matey! var_dump($supervisor2->send(['SIGHUP', $supervisor])); function makeReceiver(?int $id = null, ?array $names = null) { $names = $names ?? []; $cNames = 0; $maxUsers = 5; $running = true; $id = $id ?? random_int(1, 500000); $log = function($signal, $message, ?string $tmpl = null) use($id) { $tmpl = $tmpl ?? 'Receiver(%d): [%s](%s)'; echo sprintf($tmpl, $id, $signal, \json_encode($message)).PHP_EOL; }; while ($running) { list($signal, $message) = yield; $log($signal, $message); switch($signal) { case 'SIGHUP': // Hang up! $running = false; return null; case 'SIGCYC': // Recycle, reset $names = []; $cNames = 0; break; case 'addUser': if ($maxUsers > $cNames) { $names[] = $message; $cNames++; } break; case 'iterator': $maxUsers = 0; yield array_values(array_unique(array_values($names))); } } }
Output for 7.2.3
Receiver(35914): [addUser]("amy") Receiver(35914): [addUser]("bob") Receiver(35914): [addUser]("ellen") Receiver(35914): [addUser]("joe") Receiver(35914): [addUser]("mark") Receiver(35914): [addUser]("janice") Receiver(35914): [addUser]("franke") Receiver(35914): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(383624): [addUser]("ellen") Receiver(383624): [addUser]("joe") Receiver(383624): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.2.2
Receiver(372478): [addUser]("amy") Receiver(372478): [addUser]("bob") Receiver(372478): [addUser]("ellen") Receiver(372478): [addUser]("joe") Receiver(372478): [addUser]("mark") Receiver(372478): [addUser]("janice") Receiver(372478): [addUser]("franke") Receiver(372478): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(481049): [addUser]("ellen") Receiver(481049): [addUser]("joe") Receiver(481049): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.2.1
Receiver(438987): [addUser]("amy") Receiver(438987): [addUser]("bob") Receiver(438987): [addUser]("ellen") Receiver(438987): [addUser]("joe") Receiver(438987): [addUser]("mark") Receiver(438987): [addUser]("janice") Receiver(438987): [addUser]("franke") Receiver(438987): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(385478): [addUser]("ellen") Receiver(385478): [addUser]("joe") Receiver(385478): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.2.0
Receiver(32666): [addUser]("amy") Receiver(32666): [addUser]("bob") Receiver(32666): [addUser]("ellen") Receiver(32666): [addUser]("joe") Receiver(32666): [addUser]("mark") Receiver(32666): [addUser]("janice") Receiver(32666): [addUser]("franke") Receiver(32666): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(120787): [addUser]("ellen") Receiver(120787): [addUser]("joe") Receiver(120787): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.15
Receiver(85856): [addUser]("amy") Receiver(85856): [addUser]("bob") Receiver(85856): [addUser]("ellen") Receiver(85856): [addUser]("joe") Receiver(85856): [addUser]("mark") Receiver(85856): [addUser]("janice") Receiver(85856): [addUser]("franke") Receiver(85856): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(442488): [addUser]("ellen") Receiver(442488): [addUser]("joe") Receiver(442488): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.14
Receiver(236522): [addUser]("amy") Receiver(236522): [addUser]("bob") Receiver(236522): [addUser]("ellen") Receiver(236522): [addUser]("joe") Receiver(236522): [addUser]("mark") Receiver(236522): [addUser]("janice") Receiver(236522): [addUser]("franke") Receiver(236522): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(263183): [addUser]("ellen") Receiver(263183): [addUser]("joe") Receiver(263183): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.13
Receiver(302919): [addUser]("amy") Receiver(302919): [addUser]("bob") Receiver(302919): [addUser]("ellen") Receiver(302919): [addUser]("joe") Receiver(302919): [addUser]("mark") Receiver(302919): [addUser]("janice") Receiver(302919): [addUser]("franke") Receiver(302919): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(88102): [addUser]("ellen") Receiver(88102): [addUser]("joe") Receiver(88102): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.12
Receiver(10682): [addUser]("amy") Receiver(10682): [addUser]("bob") Receiver(10682): [addUser]("ellen") Receiver(10682): [addUser]("joe") Receiver(10682): [addUser]("mark") Receiver(10682): [addUser]("janice") Receiver(10682): [addUser]("franke") Receiver(10682): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(308210): [addUser]("ellen") Receiver(308210): [addUser]("joe") Receiver(308210): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.11
Receiver(58219): [addUser]("amy") Receiver(58219): [addUser]("bob") Receiver(58219): [addUser]("ellen") Receiver(58219): [addUser]("joe") Receiver(58219): [addUser]("mark") Receiver(58219): [addUser]("janice") Receiver(58219): [addUser]("franke") Receiver(58219): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(3769): [addUser]("ellen") Receiver(3769): [addUser]("joe") Receiver(3769): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.10
Receiver(151758): [addUser]("amy") Receiver(151758): [addUser]("bob") Receiver(151758): [addUser]("ellen") Receiver(151758): [addUser]("joe") Receiver(151758): [addUser]("mark") Receiver(151758): [addUser]("janice") Receiver(151758): [addUser]("franke") Receiver(151758): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(331643): [addUser]("ellen") Receiver(331643): [addUser]("joe") Receiver(331643): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.9
Receiver(273551): [addUser]("amy") Receiver(273551): [addUser]("bob") Receiver(273551): [addUser]("ellen") Receiver(273551): [addUser]("joe") Receiver(273551): [addUser]("mark") Receiver(273551): [addUser]("janice") Receiver(273551): [addUser]("franke") Receiver(273551): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(481154): [addUser]("ellen") Receiver(481154): [addUser]("joe") Receiver(481154): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.8
Receiver(328982): [addUser]("amy") Receiver(328982): [addUser]("bob") Receiver(328982): [addUser]("ellen") Receiver(328982): [addUser]("joe") Receiver(328982): [addUser]("mark") Receiver(328982): [addUser]("janice") Receiver(328982): [addUser]("franke") Receiver(328982): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(152754): [addUser]("ellen") Receiver(152754): [addUser]("joe") Receiver(152754): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.7
Receiver(279515): [addUser]("amy") Receiver(279515): [addUser]("bob") Receiver(279515): [addUser]("ellen") Receiver(279515): [addUser]("joe") Receiver(279515): [addUser]("mark") Receiver(279515): [addUser]("janice") Receiver(279515): [addUser]("franke") Receiver(279515): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(308645): [addUser]("ellen") Receiver(308645): [addUser]("joe") Receiver(308645): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.6
Receiver(329499): [addUser]("amy") Receiver(329499): [addUser]("bob") Receiver(329499): [addUser]("ellen") Receiver(329499): [addUser]("joe") Receiver(329499): [addUser]("mark") Receiver(329499): [addUser]("janice") Receiver(329499): [addUser]("franke") Receiver(329499): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(199527): [addUser]("ellen") Receiver(199527): [addUser]("joe") Receiver(199527): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.5
Receiver(197932): [addUser]("amy") Receiver(197932): [addUser]("bob") Receiver(197932): [addUser]("ellen") Receiver(197932): [addUser]("joe") Receiver(197932): [addUser]("mark") Receiver(197932): [addUser]("janice") Receiver(197932): [addUser]("franke") Receiver(197932): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(144689): [addUser]("ellen") Receiver(144689): [addUser]("joe") Receiver(144689): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.4
Receiver(311434): [addUser]("amy") Receiver(311434): [addUser]("bob") Receiver(311434): [addUser]("ellen") Receiver(311434): [addUser]("joe") Receiver(311434): [addUser]("mark") Receiver(311434): [addUser]("janice") Receiver(311434): [addUser]("franke") Receiver(311434): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(132104): [addUser]("ellen") Receiver(132104): [addUser]("joe") Receiver(132104): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.3
Receiver(117544): [addUser]("amy") Receiver(117544): [addUser]("bob") Receiver(117544): [addUser]("ellen") Receiver(117544): [addUser]("joe") Receiver(117544): [addUser]("mark") Receiver(117544): [addUser]("janice") Receiver(117544): [addUser]("franke") Receiver(117544): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(403433): [addUser]("ellen") Receiver(403433): [addUser]("joe") Receiver(403433): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.2
Receiver(151336): [addUser]("amy") Receiver(151336): [addUser]("bob") Receiver(151336): [addUser]("ellen") Receiver(151336): [addUser]("joe") Receiver(151336): [addUser]("mark") Receiver(151336): [addUser]("janice") Receiver(151336): [addUser]("franke") Receiver(151336): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(330010): [addUser]("ellen") Receiver(330010): [addUser]("joe") Receiver(330010): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.1
Receiver(434809): [addUser]("amy") Receiver(434809): [addUser]("bob") Receiver(434809): [addUser]("ellen") Receiver(434809): [addUser]("joe") Receiver(434809): [addUser]("mark") Receiver(434809): [addUser]("janice") Receiver(434809): [addUser]("franke") Receiver(434809): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(335490): [addUser]("ellen") Receiver(335490): [addUser]("joe") Receiver(335490): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL
Output for 7.1.0
Receiver(458840): [addUser]("amy") Receiver(458840): [addUser]("bob") Receiver(458840): [addUser]("ellen") Receiver(458840): [addUser]("joe") Receiver(458840): [addUser]("mark") Receiver(458840): [addUser]("janice") Receiver(458840): [addUser]("franke") Receiver(458840): [iterator](null) User is `amy`. User is `bob`. User is `ellen`. User is `joe`. User is `mark`. NULL Receiver(212308): [addUser]("ellen") Receiver(212308): [addUser]("joe") Receiver(212308): [iterator](null) User2 is `eduardo`. User2 is `paul`. User2 is `simon`. User2 is `ellen`. User2 is `joe`. NULL

preferences:
67.53 ms | 402 KiB | 25 Q