Как запустить вычисление при запуске сервера websocket в PHP? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть следующий сценарий:

У меня есть API, созданный с помощью Slim PHP Framework.Я использую PHP lib Ratchet для запуска сервера WebSocket.Как только сервер WebSocket запущен, я хочу запустить функцию, которая выполняет некоторые вычисления во время работы сервера.

Пока что в моем API у меня есть маршрут, который вызывает метод MyMethod класса MyClass.Внутри класса у меня есть следующее:

class MyClass {
public $calculation_status;
public function MyMethod() {
    $server = IoServer::factory(
            new HttpServer(
                new WsServer(
                    new messengerApp($this)
                )
            ),
            8080
        );

        $this->doCalculationAsynchronously()->then(
            function ($result) {
                $this->calculation_status = 'finished';
            },
            function ($reason) {
                $this->calculation_status = 'stopped';
            },
            function ($update) {
                $this->calculation_status = 'still working...';
            }
        }

        $server->run($this);
    }
    public function doCalculationAsynchronously() {
        $deferred = new Deferred();
        $this->computeSomethingAsync(function ($error = null, $result) use ($deferred) {
            if ($error) {
                $deferred->reject($error);
            } else {
                $deferred->resolve($result);
            }
        });

        return $deferred->promise();
    }

    public function computeSomethingAsync() {

        // Simulate a long running calculation
        while(true){} // OR sleep(1000000);


        return $result;
    }
}

Итак, я ожидаю, что это попытается запустить функцию асинхронного вычисления, вернуть обещание MyMethod, а затем запустить мой сервер WebSocket.

Причина внедрения $ this в сервер заключается в том, чтобы получить доступ к моему свойству Calculation_status и иметь возможность отправлять его клиентам через WS.

Этот код основан на примере для Deferred в ReactPHP doc

Примечание. Если у меня нет вечного цикла while, он запускается и правильно запускает сервер (но это синхронное поведение; моя задача для сервера - отправить расчетстатус для клиентов).Внедрение класса в объект также работает нормально.

...