今天,我的任務是,在 Laravel 應用程式用戶個人資料頁面上,用戶名旁邊添加一個綠點,表示他們是否在線,我首先想到的是,我們將需要啟動一個 node.js 服務器并跟蹤每個用戶的活動套接字連接,然后用當前登錄的用戶套接字,我們可以實時更新在線狀態!唯一的問題是,這是我們目前的要求,有點超過頂部,并沒有完全必要的,直到我們的功能,需要達到第二個準確性,如實時聊天,
一位同事指出,對于目前的需求,MySpace 用來處理 “在線” 功能的方式可能就足夠了,就我們所知,MySpace 用來顯示用戶是否在線的方式是基于他們在網站上的最后一項活動,如果他們的最后一次活動在 X 分鐘內,我們會顯示 “在線” 徽章,如果沒有,我們不會,簡單!
讓我們為用戶的上次活動在用戶表中添加一個欄位,并且在請求每個頁面時更新它,然后當我們需要檢查用戶是否在線,我們可以將該時間戳與當前時間戳進行比較,如果在 X 分鐘內,則他們在線!雖然這可以作業得很好,這取決于你正在構建的應用程式,它會向資料庫添加不必要的 寫入,這會在某種程度上降低你應用程式的速度,一個好的折衷辦法是將這些資訊存盤在應用程式快取中, 快取的好處是可以簡化這種方法,因為可以設定快取為過期,
現在我們決定使用快取實作這個特性,下一個問題是這個代碼應該在哪里運行,以便它在每個請求上運行?我有兩個想法可以實作:
創建一個 BaseController,讓你所有的 Controller 都繼承它
創建一個中間件
經過一些思考,并意識到我需要在所有已經撰寫的建構式中添加對父建構式的呼叫,我選擇在中間件中實作,
我們有個計劃,讓我們進入代碼!
首先,我們需要創建一個中間件,在終端中輸入以下命令:
php artisan make:middleware LogLastUserActivity
接下來我們打開以下 php 檔案
app/Http/Middleware/LogLastUserActivity.php.
在其中的 handle 方法中添加下面的代碼:
1 if(Auth::check()) { 2 $expiresAt = Carbon::now()->addMinutes(5); 3 Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt); 4 }
接下來,我們打開 app/Http/Kernel.php 檔案,如果您使用的是 Laravel 5.1 或 更早的版本, 您應該把代碼直接放置到 $middleware 陣列中, 如果您的版本是 5.2.* , 您應該把代碼放置到 $middlewareGroups 的 web 中 ,注意,一定要把代碼放到 StartSession 中間件的下方,否則 Auth 門面將不會正確在 user 中記錄 log,我的更新配置設定如下:
1 protected $middlewareGroups = [ 2 'web' => [ 3 \App\Http\Middleware\EncryptCookies::class, 4 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 5 \Illuminate\Session\Middleware\StartSession::class, 6 \Illuminate\View\Middleware\ShareErrorsFromSession::class 7 \App\Http\Middleware\VerifyCsrfToken::class, 8 \App\Http\Middleware\LogLastUserActivity::class, 9 ], 10 'api' => [ 11 'throttle:60,1', 12 ], 13 ];
最后一步是添加一個方法到我們的 user 物件中去檢測這個值,在 app/User.php 我們添加下面的方法:
public function isOnline()
{
return Cache::has('user-is-online-' . $this->id);
}
現在在任何頁面中你就能添加下面的方法:
1 @if($user->isOnline()) 2 user is online!! 3 @endif
重要提示 -- 確保在你的檔案頂部使用 use 引入所有的 facades!
我希望上面這些能幫助到你們解決這個問題!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117775.html
標籤:PHP
上一篇:Docker這些none:none的鏡像,難道就不配擁有名字嗎
下一篇:Swoole HTTP 的應用
