php 在React Socket客户端中执行定期作业

c7rzv4ha  于 2023-03-16  发布在  PHP
关注(0)|答案(1)|浏览(109)

我想在套接字客户端内部执行周期性作业(检查DB中的行),就像在此问题https://github.com/reactphp/socket/issues/167中尝试执行的那样
我的代码

$loop = \React\EventLoop\Loop::get();
$connector = new \React\Socket\Connector();

$connector->connect($host)->then(function (\React\Socket\ConnectionInterface $connection) use($loop){

    $connection->on('connection', function () use($loop){
        $loop->addPeriodicTimer(2, function () {
            var_dump('test - periodic job');
          
        });
    });

    $connection->write('test write');

    $connection->on('data', function ($data) {
        var_dump('test - data event');
    });
});

因此,“数据事件”工作正常,但定期作业不工作
我尝试了第二种变体:

$loop = \React\EventLoop\Loop::get();

$loop->addPeriodicTimer(2, function () {
    echo 'periodic event';
});

$connector = new \React\Socket\Connector([], $loop);
$connector->connect($host)->then(function (\React\Socket\ConnectionInterface $connection){
    $connection->write($action);

    $connection->on('data', function ($data) {
    echo 'data event';
    });
});

但在这种情况下,只有周期性事件起作用,我无法接收任何“数据事件”

w46czmvw

w46czmvw1#

我已经在https://github.com/orgs/reactphp/discussions/500中给出了答案,但我也会在这里发布我的答案:
在第一个示例中,您似乎混淆了客户端和服务器端。在第一行代码中,您创建了一个新的$connector,以便以后连接到$host。连接后,您可以使用$connection在连接上编写一些内容,您可以在我们的连接器文档中找到类似的示例:

$connector->connect($uri)->then(function (React\Socket\ConnectionInterface $connection) {
    $connection->write('...');
    $connection->end();
}, function (Exception $e) {
    echo 'Error: ' . $e->getMessage() . PHP_EOL;
});

你在$connection->on('connection', function () use($loop){...}上所做的实际上是等待新的连接事件发生,如果你仔细想想,这没有多大意义,因为你为什么要等待已经正常工作的连接上的连接事件呢?这个事件通常用于服务器端,用于从客户端传入的新连接,更多信息请参见我们的连接事件文档。
第二个示例中的问题似乎出在$action变量上,从我的Angular 来看,您似乎从未在代码中定义过$action。因此PHP会在此时抛出错误。这一切都发生在一个promise中,而promise在当前版本中吞下了异常和错误。我们已经意识到了这种行为,并正在努力通过ReactPHP v3对此进行更好的错误处理。您可以在我们的ReactPHP v3愿望清单讨论中阅读更多相关信息。
同样值得注意的是:只有当你从服务器端接收到数据时,你才会看到你的“数据事件”。2这个事件不会被你的客户端数据写入服务器所触发。
希望这能帮上忙。

相关问题