67 lines
1.4 KiB
PHP
67 lines
1.4 KiB
PHP
<?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;
|
||
}
|
||
|
||
} |