Laravel 中使用簡單的方法追蹤使用者是否在線上
今天,我的任務是,在Laravel 應用程式使用者個人資料頁面上,使用者名稱旁邊加上一個綠點,表示他們是否在線上。
我首先想到的是,我們將需要啟動一個 node.js 伺服器並追蹤每個使用者的活動套接字連接。然後用目前登入的使用者套接字,我們可以即時更新線上狀態!
唯一的問題是,這是我們目前的要求,有點超過頂部,並沒有完全必要的,直到我們的功能,需要達到第二個準確性,例如即時聊天。
一位同事指出,對於目前的需求,MySpace 用來處理 「線上」 功能的方式可能就足夠了。就我們所知,MySpace 用來顯示使用者是否在線上的方式是基於他們在網站上的最後一項活動。
如果他們的最後一次活動在 X 分鐘內,我們會顯示 「線上」 徽章,如果沒有,我們不會。簡單!
讓我們為使用者的上次活動在使用者表中新增一個字段,並且在請求每個頁面時更新它。然後當我們需要檢查用戶是否在線,我們可以將該時間戳與當前時間戳進行比較,如果在 X 分鐘內,則他們在線!
雖然這可以工作得很好,這取決於你正在建立的應用程序,它會向資料庫添加不必要的 寫入,這會在某種程度上降低你應用程式的速度。
一個好的折衷辦法是將這些資訊儲存在應用程式快取中。快取的好處是可以簡化這種方法,因為可以設定快取為過期。
現在我們決定使用快取實作這個特性,下一個問題是這個程式碼應該在哪裡運行,以便它在每個請求上運行?我有兩個想法可以實現:
建立一個BaseController,讓你所有的Controller 都繼承它
建立一個中間件
經過一些思考,並意識到我需要在所有已經編寫的構造函數中添加對父構造函數的調用,我選擇在中間件中實現。
我們有個計劃,讓我們進入程式碼!
首先,我們需要建立一個中間件。在終端機中輸入以下指令:
php artisan make:middleware LogLastUserActivity
接下來我們開啟以下php 檔案
app/Http/Middleware/LogLastUserActivity.php.
在其中的handle 方法中加入下面的程式碼:
if(Auth::check()) { $expiresAt = Carbon::now()->addMinutes(5); Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt); }
#接下來,我們打開app/Http/Kernel.php 檔案。如果您使用的是 Laravel 5.1 或 更早的版本, 您應該把程式碼直接放置到 $middleware 陣列中。如果您的版本是 5.2.* , 您應該把程式碼放置到 $middlewareGroups 的 web 中 。
注意,一定要把程式碼放到 StartSession 中間件的下方,否則 Auth 門面將不會正確地在 user 中記錄 log。我的更新配置設定如下:
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', ], ];
最後一步是將一個方法新增到我們的 user 物件中去偵測這個值。
在app/User.php 我們加入下面的方法:
public function isOnline() { return Cache::has('user-is-online-' . $this->id); }
現在在任何頁面中你就能加入下面的方法:
@if($user->isOnline()) user is online!! @endif
重要提示-- 確保在你的文件頂部使用use 引入所有的facades!
我希望上面這些能幫助到你們解決這個問題!
更多laravel框架相關技術文章,請造訪laravel教學專欄!
以上是Laravel實現追蹤用戶是否在線功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!