У меня есть личный проект, который запускает основной процесс с несколькими подпроцессами PHP, используя компонент Process Symfony (который использует proc_open () php). У меня также есть класс Event, который listens
для события будет triggered
:
Event.php
class Event
{
private $events = [];
public function listen($name, $callback)
{
$this->events[$name][] = $callback;
}
public function trigger($name, $argument = null)
{
foreach ($this->events[$name] as $event => $callback)
{
if($argument && is_array($argument)) {
call_user_func_array($callback, $argument);
} elseif ($argument && !is_array($argument)) {
call_user_func($callback, $argument);
} else {
call_user_func($callback);
}
}
}
}
Parent.php
class Parent
{
private $process;
public $event;
protected function __construct()
{
$this->event = new Event();
$this->event->listen('customEvent', function(){
echo 'A custom event was fired!'.PHP_EOL;
});
$this->process = new Process('php Child.php');
}
protected function run()
{
$this->process->start();
while($this->process->isRunning()) {}
}
}
Child.php
class Child
{
public $event;
protected function __construct()
{
$this->event = new Event();
}
protected function run()
{
while(true) {
if($condition == true) {
$this->event->trigger('customEvent');
}
}
}
}
Если я вызываю метод $this->event->trigger('customEvent');
из родительского процесса, я получаю желаемый результат (A custom event was fired!\n
). Как я могу вызвать метод trigger()
из дочернего процесса, чтобы он мог запустить функцию обратного вызова, определенную в основном процессе (используя $this->event->listen()
)? Приложение будет работать в системе Linux. Все пространства имен правильно настроены, для лучшей читаемости их не вставлено.