Вызов метода основного процесса из дочернего процесса proc_open () - PullRequest
0 голосов
/ 08 июля 2019

У меня есть личный проект, который запускает основной процесс с несколькими подпроцессами 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. Все пространства имен правильно настроены, для лучшей читаемости их не вставлено.

...