<?php namespace NoccyLabs\Ipc\Interop\Channel; /** * The MultiChannel is used to create a single channel and allow other threads * to each grab an end of it. Think for example a web server that could write * log output to a channel (as it´the MultiStreamChannel is always open); one * thread could grab a channel to dump it to the console, and another thread * could write to a logfile. */ class MultiStreamChannel implements ChannelInterface { protected $clients = []; /** * Create a new client to receive data sent to the channel * * @return StreamChannel */ public function createClient(): StreamChannel { [ $a, $b ] = StreamChannel::createPair(); $this->clients[] = $a; return $b; } /** * {@inheritDoc} * * @return boolean */ public function isOpen(): bool { return true; } /** * {@inheritDoc} * * @param mixed $data * @return void */ public function send($data) { foreach ($this->clients as $client) { $client->send($data); } } /** * {@inheritDoc} * * @return mixed */ public function receive() { foreach ($this->clients as $client) { if ($read = $client->receive()) { return $read; } } return false; } }