我想在套接字客户端内部执行周期性作业(检查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';
});
});
但在这种情况下,只有周期性事件起作用,我无法接收任何“数据事件”
1条答案
按热度按时间w46czmvw1#
我已经在https://github.com/orgs/reactphp/discussions/500中给出了答案,但我也会在这里发布我的答案:
在第一个示例中,您似乎混淆了客户端和服务器端。在第一行代码中,您创建了一个新的
$connector
,以便以后连接到$host
。连接后,您可以使用$connection
在连接上编写一些内容,您可以在我们的连接器文档中找到类似的示例:你在
$connection->on('connection', function () use($loop){...}
上所做的实际上是等待新的连接事件发生,如果你仔细想想,这没有多大意义,因为你为什么要等待已经正常工作的连接上的连接事件呢?这个事件通常用于服务器端,用于从客户端传入的新连接,更多信息请参见我们的连接事件文档。第二个示例中的问题似乎出在
$action
变量上,从我的Angular 来看,您似乎从未在代码中定义过$action
。因此PHP会在此时抛出错误。这一切都发生在一个promise中,而promise在当前版本中吞下了异常和错误。我们已经意识到了这种行为,并正在努力通过ReactPHP v3对此进行更好的错误处理。您可以在我们的ReactPHP v3愿望清单讨论中阅读更多相关信息。同样值得注意的是:只有当你从服务器端接收到数据时,你才会看到你的“数据事件”。2这个事件不会被你的客户端数据写入服务器所触发。
希望这能帮上忙。