実行するタスクのリストを外部サーバーにポーリングし、それらのタスクを実行する、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 を使用しています。