使用可变退避计时器轮询外部服务器的长 运行 脚本?

Long running script that polls external server with variable backoff timer?

我正在编写一个基于 Amphp 库的长 运行ning 脚本,它将轮询外部服务器以获取 运行 的任务列表,然后执行这些任务。

来自服务器的响应将是退避计时器,它将控制脚本何时发出下一个请求。

由于我对异步编程还很陌生,所以我尝试的方法不起作用。

我试图创建一个 \Amp\repeat() 有一个 \Amp\Pause(1000) 这样每次重复都会暂停 1 秒。

这是我的测试代码:

function test() {
    // http request goes here...

    echo 'server request '.microtime(true).PHP_EOL;

    // based on the server request, change the pause time
    yield new \Amp\Pause(1000);
}

Amp\execute(function () {
    \Amp\onSignal(SIGINT, function () {
        \Amp\stop();
    });

    \Amp\repeat(100, function () {
        yield from test();
    });
});

我期望发生的是在每次重复时,test() 函数会在回声后暂停 1 秒,但回声是 运行 每 100 毫秒(重复时间)。

在过去,我会使用 while 循环和 usleep() 来完成此操作,但由于 usleep() 被阻止,所以这违背了目的。

我正在使用 PHP 7.0 和来自 github master 分支的 Amphp。

\Amp\repeat 每 100 毫秒调用一次回调,无论回调何时终止。

\Amp\execute(function () {
    /* onSignal handler here for example */

    new \Amp\Coroutine(function () {
        while (1) {
            /* dispatch request */
            echo 'server request '.microtime(true).PHP_EOL;
            yield new \Amp\Pause(100);
        }
    });
});

这是使用在最后一个动作后仅持续 100 毫秒的正常循环。

[如果我误解了你的意思,请在评论中指出。]