2

ここでCFで解くパズルを少しします。

サーバーに引数として渡されたタイムスタンプがあります。たとえば2012-5-10 14:55。与えられた時間から30秒が経過して戻ってきたかどうかをどのように確認しますtruefalse

ルール:

  1. タイムスタンプは世界中のどこからでも取得され、常に間違っているため、現在のサーバー時刻を使用して30秒が経過したかどうかを確認することはできません。

  2. この場合、サーバーに渡された引数のタイムスタンプを常に信頼できます。

これはColdFusion9でどのように可能でしょうか(あるとしても)?

4

2 に答える 2

3

うーん....あなたの問題はあなたが待ち時間を知らないということです。タイムスタンプを受け取ってから30秒を数えることができますが、タイムスタンプが作成されてから数秒かかる場合があります。

あなたは30秒を簡単に数えることができます...

sleep(30000); //1000 miliseconds = 1 second. 30k = 30 seconds

したがって、varを取得するとすぐに、30秒間「待機」してから、何かを実行できます。しかし、あなたの質問から、タイムスタンプ(クライアントで作成された)が作成された時から正確に30秒が必要であるように思われます。次の理由で、おそらくそれほど正確にすることはできません。

  1. 2つのクロックが同期していません
  2. リクエストのレイテンシーを把握することはできません。
  3. 可能であっても、クライアントを制御しないため、HTTPはステートレスであり、リアルタイムではないため、結果を保証するのに問題が発生します。

HTML5ブラウザーを指示できる場合は、これにWebSocketを使用できます-実際にはそれを懇願しています:)しかし、それが私が考えることができる唯一の実際の解決策です。

于 2012-05-10T15:59:26.383 に答える
1

サーバーに渡される引数がAPIリクエスト、フォーム送信、ajaxリクエストなどのいずれであるかを指定しないため、反対側の実装に違いがあります。ただし、ColdFusionサーバーの端は非常に似ている必要があり、基本的に3つの問題があります。タイムゾーン、時間の不一致、および遅延。

タイムゾーンの問題を解決するには、引数をUTC時間として渡すように要求できます。時間をColdfusionと比較すると、次のようになります。

<cfif DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Now() )) EQ 30>
  <!--- Exactly 30 seconds difference between timestamps --->
</cfif>

ただし、送信された時刻がサーバーの時刻と同期しているかどうかはわかりません。これを支援するために、相手側が自分の時間を照会し、それに応じて時間を調整するか、自分の時間をエコーバックする方法を提供できます。

その時間の同期と最初に議論されたタイムスタンプの送信は両方とも待ち時間に悩まされます。ネットワークを介した通信は、遅延のレベルが異なるだけで、遅延の影響を受けます。場所とインターネット接続の種類は、プロトコルの種類よりも大きな影響を与える可能性があります。もう一方の端にpingを実行して応答時間を取得し、それを半分にしてタイムスタンプに追加するようなこともできますが、それでも概算であり、すべてのサーバーがpingに応答するわけではありません。

さらに、サーバーともう一方の端のコードも遅延を引き起こします。これを減らすには、もう一方の端でリクエストの最後にできるだけ近いタイムスタンプを計算し、コードでできるだけ早くタイムスタンプを計算する必要があります。これは、ColdFusionで、Application.cfm|cfcの最上部にできるだけ近いリクエスト時間を設定することで実行できます。

<cfset Request.Now = Now()>

次に、チェックコードを次のように変更します。

DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Request.Now ))

代わりに、30秒が経過するまでループしてから応答する場合は、待ち時間によって応答がもう一方の端に戻るのが遅れるため、30秒後に応答が発生しないように見えることに注意してください。

正確に30秒を取得することは不可能ですが、より近づくための手順を実行します。約30秒が経過したかどうかを確認する必要がある場合は、それで十分です。

于 2012-05-10T23:32:03.550 に答える