Как использовать объект Ratchet \ Server \ IoServer после запуска?

Я хочу запустить функцию, которая перебирает класс генератора. Функции генератора будут работать до тех пор, пока соединение Ratchet остается активным. Все, что мне нужно сделать, это чтобы это произошло после run Метод выполняется:

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/xxx/vendor/autoload.php';

$server = IoServer::factory(

new HttpServer(
new WsServer(
new Chat()
)
),

8180,
'0.0.0.0'

);

$server->run();

Это метод, который мне нужно запустить на сервере после его запуска:

function generatorFunction()
{

$products = r\table("tableOne")->changes()->run($conn);
foreach ($products as $product) {
yield $product['new_val'];
}

}

Ранее я вызывал функцию раньше $server->run() как это:

for ( $gen = generatorFunction(); $gen->valid(); $gen->next()) {
var_dump($gen->current());
}
$server->run();

Но это не позволяет клиенту установить соединение с сервером Ratchet. Я подозреваю, что это никогда не приходит к $server->run() как класс генератора повторяется.

Итак, теперь я хочу сначала запустить сервер, а затем вызвать этот метод генератора, чтобы он мог продолжать слушать изменения в rethinkdb,

Как я могу это сделать?

10

Решение

Давайте начнем с примера:

<?php

require 'vendor/autoload.php';

class Chat implements \Ratchet\MessageComponentInterface {
function onOpen(\Ratchet\ConnectionInterface $conn) { echo "connected.\n"; }
function onClose(\Ratchet\ConnectionInterface $conn) {}
function onError(\Ratchet\ConnectionInterface $conn, \Exception $e) {}
function onMessage(\Ratchet\ConnectionInterface $from, $msg) {}
}

$loop = \React\EventLoop\Factory::create(); // create EventLoop best for given environment
$socket = new \React\Socket\Server('0.0.0.0:8180', $loop); // make a new socket to listen to (don't forget to change 'address:port' string)
$server = new \Ratchet\Server\IoServer(
/* same things that go into IoServer::factory */
new \Ratchet\Http\HttpServer(
new \Ratchet\WebSocket\WsServer(
new Chat() // dummy chat to test things out
)
),
/* our socket and loop objects */
$socket,
$loop
);

$loop->addPeriodicTimer(1, function (\React\EventLoop\Timer\Timer $timer) {
echo "echo from timer!\n";
});

$server->run();

Чтобы достичь того, что вам нужно, вам не нужно запускать цикл до или же после $server->run() но это должно быть запущено одновременно.

Для этого вам нужно стать глубже, чем Ratchet — в ReactPHP и его EventLoop. Если у вас есть доступ к интерфейс петли затем добавление таймера (который выполняется один раз) или периодического таймера (каждую n-ю секунду) — это очень просто.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]