<?php
/**
Example showing the usage of events.
The documentation still is very thin, so I'm not sure, the example is the best solution. But it works.
*/
use parallel\{Channel,Runtime,Events,Events\Event};
$myThread = function(Channel $channel) {
$events = new Events();
$events->addChannel($channel);
//$events->setBlocking(false); //Uncomment to don't block on Events::poll()
$events->setTimeout(1000000); //Comment when not blocking
while(true)
    {
/*
        ...
        Your code.
        ...
        */
        //Read all available events
try
        {
$event = NULL;
            do
            {
$event = $events->poll(); //Returns non-null if there is an event
if($event && $event->source == 'myChannel')
                {
//It seems, the target gets deleted after returning an event,
                    //so add it again.
$events->addChannel($channel);
                    if($event->type == Event\Type::Read)
                    {
                        if(is_array($event->value) && count($event->value) > 0)
                        {
                            if($event->value['name'] == 'stop')
                            {
                                echo 'Stopping thread';
                                return; //Stop
}
                            else
                            {
                                echo 'Event: '.$event->value['name'].' => '.$event->value['value'].PHP_EOL;
                            }
                        }
                    }
                    else if($event->type == Event\Type::Close) return; //Stop
}
            }
            while($event);
        }
        catch(Events\Error\Timeout $ex)
        {
//Timeout
echo 'Timeout'.PHP_EOL;
        }
    }
};
class MyClass {
    private $runtime;
    private $future;
    private $channel;
    public function start() {
//Create runtime
$this->runtime = new Runtime();
//Create buffered channel.
        //Buffered channels don't block on Channel::send().
        //Note that target names need to be unique within the process.
$this->channel = Channel::make('myChannel', Channel::Infinite);
        global $myThread;
$this->future = $this->runtime->run($myThread, [$this->channel]);
    }
    public function stop() {
$this->channel->send(['name' => 'stop', 'value' => true]);
$this->future->value(); //Wait for thread to finish
$this->channel->close();
    }
    public function emit(string $name, $value)
    {
$this->channel->send(['name' => $name, 'value' => $value]);
    }
}
$a = new MyClass();
$a->start();
for($i = 0; $i < 5; $i++)
{
$a->emit('test', $i);
sleep(0.5);
}
sleep(2);
for($i = 5; $i < 10; $i++)
{
$a->emit('test', $i);
sleep(0.5);
}
$a->stop();
?>