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

时间:2016-11-04 12:39:33

标签: amphp

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

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

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

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

这是我的测试代码:

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秒,而是每隔100ms(重复时间)运行一次回声。

过去我会用while循环和usleep()完成这个,但是因为usleep()阻塞了这个目的。

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

1 个答案:

答案 0 :(得分:1)

无论回调何时终止,

\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毫秒。

[如果我误解了你想要的是什么,请在评论中注明。]