2016-11-04 9 views
2

私はAmphpライブラリに基づいて、実行するタスクの一覧を外部サーバーにポーリングし、それらのタスクを実行する、長時間実行しているスクリプトを作成しています。可変バックオフタイマーを使用して外部サーバーをポーリングする長期実行スクリプト?

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

私は非同期プログラミングに新しいので、私が試しているものは動作していません。

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

は、ここに私のテストコードです:私は、各繰り返しで、テスト()関数は、エコーの後に1秒のために一時停止するというものであったが起こることが予想代わりにエコーが100ms毎に実行された何

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(); 
    }); 
}); 

(繰り返し時間)。

これまで私はwhileループとusleep()でこれを達成しましたが、usleep()はこれをブロックしているので目的を破りました。

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

答えて

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 msだけ続く通常のループを使用しています。

[正確に何を望んでいるかわからない場合は、コメントにご注意ください。]

+0

これは、私のコードが機能しない理由を説明しています。これはサーバーのポーリングをお勧めしますか? –

+0

@AshleyHood最後の要求の終了から次の要求の開始までの間に100msの遅延を持たせたい場合は、yesとします。 – bwoebi

関連する問題