我有一个安全的websocket设置,并与棘轮和ReactPHP的组合工作。我想要完成的一部分,是允许用户执行一些将发送到服务器的操作,并获得每个部分完成的通知-类似于以下内容:
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来实现其他功能)来实现这一点。
我一直在寻找示例并尝试不同的方法来尝试实现这一点,但我真的在努力,在其他地方找不到任何实现这一点的示例。现在我觉得我需要将它作为一个子进程运行,然后(以某种方式)轮询它,但我也发现这很棘手。
因此,如果有人有建议,示例逻辑,或者我应该在哪里创建这个可以报告其过程的异步函数/类的指针,那将是令人惊讶的。谢谢。
发布于 2021-04-16 00:49:22
我已经设法通过使用$loop->futureTick功能解决了我的问题。我创建了一个类,其中的操作被拆分成方法,如果方法结束,它将利用futureTick方法将下一个操作排入队列。下面是我的意思的一个例子:
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();
});
}
}这允许通过循环完成每个操作,并且每次函数完成时都会通知客户端。
这可能不是实现这一目标的理想方式,所以我仍然愿意接受建议,例如,是否应该将操作创建为单独的进程,并随着进程的进展而告知连接。我只是不确定目前如何实现这一目标。
https://stackoverflow.com/questions/67111035
复制相似问题