オークションシステムはセントラルクロックを必要とする


時計で動く競売


オークションシステムのいずれかのライブまたはタイムクロックを実行します.ライブオークションでは、しばしば時計に応じて入札を呼び出します.時限オークションでは、起動し、クロックでオークションを終了し、ユーザーがカウントダウンタイマーを示しています.

ブラウザー時間は信用できません


ブラウザでnew Date() ユーザーのローカル時刻に応じてユーザーローカル時間を与えます.ユーザーが別のタイムゾーンに存在するように、さらに不正確なコンピュータクロックを持っている可能性があります、または彼らは意図的にその時計を変更することがあります、ローカル時間は異なります.
明らかに、1つは、ユーザーが任意の時間依存の機能を観察し、任意の時間に依存した動作を、オークションシステムのすべてのユーザーのための同じクロックに基づいて行うことはできません.

中央時計が必要


したがって、オークションシステムは論理的に中央クロックを必要とし、そのクロックは、カウントダウンタイマー、またはオークション開始および終了時間のような絶対時間などの相対時間が、Webページ上のユーザーによって観察される場合には、すべてのユーザーに投影されなければならない.Webページは、ユーザーのタイムゾーンに絶対時間を表示することがありますが、ローカル時刻を中央クロックから派生させる必要があります.
このようなセントラルクロックはサーバーで実装されなければなりません.ユーザのWebページに送信する必要があります.
この種の伝送は、時間のベースのイベント(例えば競売開始または終了)のいずれかでありえる.そして、ウェブページが動的に、例えば、秒読みタイマーを進めることを調整する.
中央時計の存在は、サーバーがアップデートを送るリアルタイムウェブアプリケーションの必要を意味します.

セントラルクロックの実装


ノード。js


サーバ側


Webページとサーバーを統合するSocket.IO .
サーバ実行時setTimeout or setInterval , イベントベースのアクションまたは定期的な更新、それぞれ.

フロントエンドイベントベース


フロントエンドでは、イベントベースのオークションなどのソケットイベントを聞きます.
    socket.on('advanceCall', (data) => {});
Or
socket.on('startAuction', (data) => {});

フロントエンド周期


socket.on('time', (data) => {});

ラーラベル


サーバ側


用途ReactPHP タイマーを実装するには、周期的に、
$timer = $loop->addPeriodicTimer($time, function() 
    use(&$task) {
broadcast(new TimeSignal(json_encode(...)));
});
どこTimeSignalLaravel event .
あるいは一回
$timer = $loop->addTimer($time, function() 
    use(&$task) {
         broadcast(new AuctionCall(json_encode(...))); 
});
どこAuctionCall はラービアのイベントです.
詳細については、私の記事を参照してくださいTimer Server in ReactPHP .
イベントを使って放送するLaravel Echo Server or Laravel Websockts

フロントエンド


ソケットでイベントを聞いてください.入出力
window.Echo.channel('auction-events')
  .listen('startAuction', (e) => {

  });
Or
   window.Echo.channel('time-signal')
   .listen('time', (e) => {

    });