У меня есть следующий сценарий:
У меня есть 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, он запускается и правильно запускает сервер (но это синхронное поведение; моя задача для сервера - отправить расчетстатус для клиентов).Внедрение класса в объект также работает нормально.