2

実行するタスクのリストを外部サーバーにポーリングし、それらのタスクを実行する、Amphp ライブラリに基づく長期実行スクリプトを作成しています。

サーバーからの応答には、スクリプトが次の要求を行うタイミングを制御するバックオフ タイマーがあります。

私は非同期プログラミングに非常に慣れていないので、私が試みていることは機能していません。

各リピートが1秒間一時停止するように、 \Amp\Pause(1000) を持つ \Amp\repeat() を作成しようとしました。

ここに私のテストコードがあります:

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() がブロックしているため、これは目的に反します。

github master ブランチの PHP 7.0 と Amphp を使用しています。

4

1 に答える 1