首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Ratchet\ReactPHP发送操作的状态更新

通过Ratchet\ReactPHP发送操作的状态更新
EN

Stack Overflow用户
提问于 2021-04-15 23:08:13
回答 1查看 40关注 0票数 0

我有一个安全的websocket设置,并与棘轮和ReactPHP的组合工作。我想要完成的一部分,是允许用户执行一些将发送到服务器的操作,并获得每个部分完成的通知-类似于以下内容:

代码语言:javascript
复制
public function process()
{
    $this->currentconnection->send("Doing 1 of 3");
    // action first part of process
    $this->currentconnection->send("Doing 2 of 3");
    // uses output of first part to perform second
    $this->currentconnection->send("Doing 3 of 3");
    // uses output of second to perform third
    $this->currentconnection->send("Complete!");
}

然而,这实际上是在创建一个阻塞函数,因为当这个函数运行时,直到该函数完成处理时,消息才会发送到连接。

以前,我是通过在浏览器和PHP后端之间来回发送ajax请求来实现这一点的,但我想我也许可以在没有来回来回的情况下实现这一点,并使用websocket (我正在使用websocket来实现其他功能)来实现这一点。

我一直在寻找示例并尝试不同的方法来尝试实现这一点,但我真的在努力,在其他地方找不到任何实现这一点的示例。现在我觉得我需要将它作为一个子进程运行,然后(以某种方式)轮询它,但我也发现这很棘手。

因此,如果有人有建议,示例逻辑,或者我应该在哪里创建这个可以报告其过程的异步函数/类的指针,那将是令人惊讶的。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-04-16 00:49:22

我已经设法通过使用$loop->futureTick功能解决了我的问题。我创建了一个类,其中的操作被拆分成方法,如果方法结束,它将利用futureTick方法将下一个操作排入队列。下面是我的意思的一个例子:

代码语言:javascript
复制
class Actions
{
    public function __construct(ConnectionInterface $conn, $loop)
    {
        $this->connection = $conn;
        $this->loop = $loop;
    }

    public function action1()
    {
        // ... do action ...
        if ($fail) {
            $this->connection->send('Action 1 failed');
        } else {
            $this->connection->send('Action 1 success');
            $this->loop->futureTick(function() {
                $this->action2();
            });
        }
    }

    public function action2()
    {
        ...
        $this->loop->futureTick(function() {
            $this->action3();
        });
    }
}

这允许通过循环完成每个操作,并且每次函数完成时都会通知客户端。

这可能不是实现这一目标的理想方式,所以我仍然愿意接受建议,例如,是否应该将操作创建为单独的进程,并随着进程的进展而告知连接。我只是不确定目前如何实现这一目标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67111035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档