PHP Laravel 中使用簡單的方法跟蹤用戶是否線上

来源:https://www.cnblogs.com/a609251438/archive/2019/11/07/11815698.html

今天,我的任務是,在 Laravel 應用程式用戶個人資料頁面上,用戶名旁邊添加一個綠點,表示他們是否線上。我首先想到的是,我們將需要啟動一個 node.js 伺服器並跟蹤每個用戶的活動套接字連接。然後用當前登錄的用戶套接字,我們可以實時更新線上狀態!唯一的問題是,這是我們目前的要求,有點超過頂部, ...


  今天,我的任務是,在 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!

我希望上面這些能幫助到你們解決這個問題!


您的分享是我們最大的動力!

更多相關文章
  • (手機橫屏看源碼更方便) 註:java源碼分析部分如無特殊說明均基於 java8 版本。 註:本文基於ForkJoinPool分治線程池類。 簡介 隨著在硬體上多核處理器的發展和廣泛使用,併發編程成為程式員必須掌握的一門技術,在面試中也經常考查面試者併發相關的知識。 今天,我們就來看一道面試題: 如 ...
  • 題目: 鏈接:https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b?orderByHotValue來源:牛客網牛牛舉辦了一次編程比賽,參加比賽的有3*n個選手,每個選手都有一個水平值a_i.現在要將這些選 ...
  • 1 先談Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好、更及時,所以筆者建議大家完全可以忘掉Java語言中有這個方法的存在。 ——《深入理解JVM》 finalize()方法確實可以實現一次對象的自救,但是其不確定性和昂貴的運行代價都表 ...
  • 通過前面2篇文章我們搭建了SW的基礎環境,監控了微服務,能瞭解所有服務的運行情況。但是當出現服務響應慢,介面耗時嚴重時我們需要立即定位到問題,這就需要我們今天的主角 監控告警,同時此篇也是SW系列的最後一篇。 UI參數 首先我們認識一下SW DashBoard上的幾個關鍵參數,如下圖所示 告警配置 ...
  • 一.docker簡介 1、docker定義:docker是一個用來裝應用的容器,就像杯子可以裝水,筆筒可以裝筆,書包可以放書一樣。你可以把“Hello World!”放到docker中,也可以把網站放到docker中,你可以把任何你想到的程式放到docker中。 2、docker思想: (1)集裝箱 ...
一周排行
  • static void Main(string[] args) { string url = "https://go.microsoft.com/fwlink/?linkid=2108895&clcid=0x409"; DownloadBigFile(new Uri(url), "ssms.... ...
  • 1. 使用ASP.NET Core 3.x 構建 RESTful API - 1.準備工作 什麼是REST 什麼是REST REST一詞最早是在2000年,由Roy Fielding在他的博士論文《Architectural Styles and the Design of Network-base ...
  • wpf 兩個自定義控制項 一個是IP控制項,一個滑動條。先看下效果圖 IPControl 1、實際工作中有時需要設置IP信息,就想著做一個ip控制項。效果沒有window自帶的好,需要通過tab切換。但也能滿足使用。廢話不多說直接上代碼 IPControl.xaml IPControl.xaml.cs 2 ...
  • 近期和幾位做嵌入式開發的朋友閑聊過程中,一位朋友抱怨到:這C#太難用了,我想在N個窗體(或者是N個用戶組件之間)傳遞值都搞不定,非得要定義一個全局變數來存儲,然後用定時器來刷新值,太Low了。我急切的回答道:這很簡單,不就是委托的事嘛。那你來一個示例啊:朋友道。此為這篇博客的起因,所以此篇博客對於有 ...
  • 在面對對象編程中,類的三大特性分別為封裝,繼承,多態。其中多態的具體實現,依賴於三個方法,也就是虛方法,抽象類和介面。 多態的具體作用是什麼呢?或者說多態的存在有什麼意義呢?多態的存在有效的降低了程式的耦合度,在使用的時候,不僅可以表現大家都有的共性,還能在必要的時候突出一些特殊的的個性。 那麼如何 ...
  • [toc] 前言 在之前已經提到過,公用類庫Util已經開源,目的一是為了簡化開發的工作量,畢竟有些常規的功能類庫重覆率還是挺高的,二是為了一起探討學習軟體開發,用的人越多問題也就會越多,解決的問題越多功能也就越完善, 倉庫地址: "April.Util_github" , "April.Util_ ...
  • 【ASP.NET Core學習】在ASP.NET Core 種使用Entity Framework Core介紹,包括如何添加Entity Framwork Core,創建模型和遷移到資料庫,查詢數據,保存數據,使用事務,處理併發衝突 ...
  • 環境:MacOS 10.13 MAMAP Prophp 7.0.33 + xdebugVisual Studio Code前言我所理解的 POP Chain:利用魔術方法並巧妙構造特殊屬性調用一系列函數或類方法以執行某種敏感操作的調用堆棧反序列化常用魔法函數前言我所理解的 POP Chain:利用魔 ...
  • 當創建隊列jobs、監聽器或訂閱伺服器以推送到隊列中時,您可能會開始認為,一旦分派,隊列工作器決定如何處理您的邏輯就完全由您自己決定了。 嗯……並不是說你不能從作業內部與隊列工作器交互,但是通常情況下,哪怕你做了,也是沒必要的。 這個神奇的騷操作的出現是因為“InteractsWithQueue”這 ...
  • 在說正題之前先解釋一下交換機模式是個籠統的稱呼,它不是一個單獨的模式(包括了訂閱模式,路由模式和主題模式),交換機模式是一個比較常用的模式,主要是為了實現數據的同步。 首先,說一下訂閱模式,就和字面上的意思差不多主要就是一個生產者,多個消費者,同一個消息被多個消費者獲取,先看一下官網的圖示 整體執行 ...
x