Laravel で簡単なメソッドを使用して、ユーザーがオンラインかどうかを追跡する
今日の私のタスクは、 Laravel プログラムのユーザー プロフィール ページでは、オンラインかどうかを示す緑色の点がユーザー名の横に追加されます。
私が最初に考えたのは、node.js サーバーを起動して、各ユーザーのアクティブなソケット接続を追跡する必要があるということでした。次に、現在ログインしているユーザー ソケットを使用して、オンライン ステータスをリアルタイムで更新できます。
唯一の問題は、これは現在の要件に対して少しやりすぎであり、ライブ チャットなど、第 2 レベルの精度を必要とする機能が実装されるまでは完全に必要ではないことです。
同僚は、現在のニーズに対しては、MySpace が「オンライン」機能を処理する方法で十分かもしれないと指摘しました。私たちが知る限り、MySpace がユーザーがオンラインかどうかを示すために使用している方法は、サイトでの最後のアクティビティに基づいています。
最後のアクティビティが X 分以内だった場合は「オンライン」バッジが表示されますが、そうでない場合は表示されません。単純!
ユーザーの最後のアクティビティのフィールドをユーザー テーブルに追加し、ページ リクエストごとに更新してみましょう。次に、ユーザーがオンラインかどうかを確認する必要がある場合、そのタイムスタンプを現在のタイムスタンプと比較し、X 分以内であればオンラインであると言えます。
これは問題なく動作しますが、構築しているアプリケーションによっては、データベースに不必要な書き込みが追加され、アプリケーションの速度が多少低下します。
適切な妥協案は、この情報をアプリケーション キャッシュに保存することです。キャッシュの利点は、キャッシュの有効期限を設定できるため、このアプローチが簡素化できることです。
キャッシュを使用してこの機能を実装することに決めたので、次の疑問は、すべてのリクエストで実行されるように、このコードをどこで実行する必要があるかということです。実現したいアイデアが 2 つあります。
BaseController を作成し、すべてのコントローラーにそれを継承させる
#ミドルウェアを作成する
#少し考えた後、そして、これまでに作成したすべてのコンストラクターに親コンストラクターへの呼び出しを追加する必要があることに気づき、それをミドルウェアに実装することにしました。 計画はできたので、コードを作成してみましょう。 まず、ミドルウェアを作成する必要があります。ターミナルに次のコマンドを入力します。php artisan make:middleware LogLastUserActivity
app/Http/Middleware/LogLastUserActivity.php.
if(Auth::check()) { $expiresAt = Carbon::now()->addMinutes(5); Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt); }
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class \App\Http\Middleware\VerifyCsrfToken::class, \App\Http\Middleware\LogLastUserActivity::class, ], 'api' => [ 'throttle:60,1', ], ];
public function isOnline() { return Cache::has('user-is-online-' . $this->id); }
@if($user->isOnline()) user is online!! @endif
laravel チュートリアル 列をご覧ください。
以上がLaravelはユーザーがオンラインであるかどうかを追跡する機能を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。