运行 执行后如何使用 Ratchet\Server\IoServer 对象?
How do I use a Ratchet\Server\IoServer object after run executed?
我想要 运行 一个遍历生成器的函数 class。只要 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()
因为生成器 class 正在迭代。
所以现在,我想先启动服务器,然后调用这个生成器方法,让它可以一直监听rethinkdb
的变化。
我该怎么做?
让我们从例子开始:
<?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();
要实现您需要的功能,您不必 运行 循环 before 或 after $server->run()
但需要同时 运行。
为此,您需要比 Ratchet 更深入 - ReactPHP 及其 EventLoop. If you have access to the loop interface 然后添加一个计时器(执行一次)或一个周期性计时器(每第 n 秒)是小菜一碟。
我想要 运行 一个遍历生成器的函数 class。只要 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()
因为生成器 class 正在迭代。
所以现在,我想先启动服务器,然后调用这个生成器方法,让它可以一直监听rethinkdb
的变化。
我该怎么做?
让我们从例子开始:
<?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();
要实现您需要的功能,您不必 运行 循环 before 或 after $server->run()
但需要同时 运行。
为此,您需要比 Ratchet 更深入 - ReactPHP 及其 EventLoop. If you have access to the loop interface 然后添加一个计时器(执行一次)或一个周期性计时器(每第 n 秒)是小菜一碟。