0

私はカレンダーとアジェンダライブラリ(CodeIgniterフレームワークに取り組んでいます)を構築する任務を負いました。これはカレンダーを表示し、ユーザーはそのカレンダーにイベントを設定することができます。これらのイベントには、電子メールと、ユーザーがサイトを閲覧しているときにポップアップの両方の通知システムがあります。

私の問題は、ユーザーがサイトにいるときに通知部分にアプローチする方法です。この電子メールは、x分ごとに実行され、通知電子メールを送信する必要があるかどうかを確認するcronジョブを介して実行されることをすでに決定したものです。

オンサイト通知は別のものです。これにどのようにアプローチしますか?x秒ごとにサーバーにajaxリクエストを送信することはできません。これは、システムに許容できない負荷がかかるためです。(もちろん、ユーザーに最終的に通知されたときに、データベースでユーザーを「再マイニング」として設定するように要求する必要があります)。ユーザーは世界中のどこにいても時間は異なる可能性があるため、ユーザーの日時だけに依存することはできません。サーバーに繰り返しリクエストを行わないように、ユーザーにイベントを通知する必要があることを確認するにはどうすればよいですか?任意の入力をいただければ幸いです。

4

2 に答える 2

1

簡単にスケーラブルな通知システムはWebSocketを使用します。これは、モバイルデバイス上でも、今日では大多数のユーザーに届きます。残念ながら、WebSocket対応のサーバー(ノード、Glassfishな​​ど)が必要になります。これは、標準のPHPデプロイメント(mod_phpまたはfcgi)では実行できません。サーバーイベント(いわゆるサーバープッシュ)は、生成時に送信されるため、WebSocketのクライアントサーバーペアを取得したら、リマインダーを送信することは、電子メールを送信することと同じです。

リマインダーがポップアップする正確な時間にユーザーがオンラインにならない可能性が高いため、実際には状況はより複雑です。ユーザーがページにアクセスするたびに更新される通知アイコンをお勧めします。このようにして、カレンダーシステム(cronジョブを想定)はDB内のユーザー行のフラグを更新するだけで、ページを作成するときに、リマインダーがあるかどうか(たとえば、次の60分以内)をすでに知っています。それに応じてアイコンを選択してください。この時点で、2つの選択肢があります。

  1. すべてのリクエストとともにリマインダーをクライアントに送信します(帯域幅の浪費になる可能性がありますが、JSONでエンコードされたイベントのリストがそれほど重いとは思いません)
  2. リマインダーをオンデマンドで非同期にダウンロードします。つまり、ユーザーが通知アイコンを押したときにのみダウンロードします。

このシナリオでは、PHP環境とコードを再利用でき、WebSocketサーバー用に別のホストを必要としません。これが、サーバーによって適切なタイミングでトリガーされる真のポップアップリマインダーの要件を満たしていない場合でも、これが最善の解決策だと思います。ところで、リクエストごとにイベントを送信すると、必要に応じてJavaScriptがポップアップ表示されます。これに使用できますsetTimeout()

于 2012-12-04T20:18:13.420 に答える
1

setTimeoutはこれを行うために使用するのを見ることができました。$minutesTilDueリマインダーの期限が切れる数分前にユーザーがページにアクセスしたとします。jQuery / PHPを想定しています:

$(function(){
    setTimeout(function(){
       showEventReminder(<?php json_encode($event) ?>);
    }, <?php echo $minutesTilDue ?> * 60 * 1000);
});

派手すぎるものはありませんが、要件によって異なります...

乾杯

于 2012-12-04T21:33:33.263 に答える