日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

记一次对 Laravel-permission 项目的性能优化

發(fā)布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记一次对 Laravel-permission 项目的性能优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我最近研究分析了在?SWIS上面創(chuàng)建的項目的性能。令人驚訝的是,最耗費性能的方法之一是優(yōu)秀的 ?spatie/laravel-permission?包造成的。

經(jīng)過查閱更多資料和研究,發(fā)現(xiàn)一個可能明顯改善的性能問題?。既然解決方案已明確闡述,就很容易編寫代碼改善,提交請求。

現(xiàn)在這個解決方案已被合并和發(fā)布,下面是這個性能問題的分析和如何在自己的項目避免這類問題。

TL;DR:?跳轉(zhuǎn)到結(jié)論部分.

性能瓶頸

如果我們抽象的看?spatie/laravel-permission?它主要做兩件事:

  • 保持一個屬于某個模型的權(quán)限清單。
  • 檢查某個模型是否具有權(quán)限。
  • 第一點說是性能瓶頸有點牽強。這里的權(quán)限數(shù)據(jù)存放在數(shù)據(jù)庫中,需要的時候?qū)蛔x取出來。這個過程是有點慢但也只是執(zhí)行一次。結(jié)果會被緩存下來,后續(xù)的請求可以直接使用。

    第二點在性能瓶頸的觀點上來看確實是一個瓶頸。 這個瓶頸取決于權(quán)限的性質(zhì)和項目的大小, 因為權(quán)限會被頻繁的檢查。 在這個檢查的過程中任何的遲鈍都會成為整個項目的性能瓶頸。

    過濾集合類

    過濾權(quán)限集合的方法被認為是造成低性能的原因。 它做了如下事情:

    $permission = $permissions->where('id', $id)->where('guard_name', $guardName)->first();

    修改后:

    $permission = $permissions->filter(function ($permission) use ($id, $guardName) {return $permission->id === $id && $permission->guard_name === $guardName;})->first();

    這兩個代碼段實現(xiàn)了同一件事情,但第二個更快。

    性能測試

    我正在開發(fā)的應(yīng)用中大約有 150 個不同的權(quán)限。 在一個普通的請求中, 大約有 50 個權(quán)限需要用 ?hasPermissionTo?這個方法去檢查,當然,有些頁面可能需要檢查大約 200 個權(quán)限。

    以下是用來做性能測試的一些設(shè)置。

    $users = factory(User::class, 150)->make(); $searchForTheseUsers = $users->shuffle()->take(50);# 方法 1: where foreach($searchForTheseUsers as $user) {$result = $users->where('id', '=', $user->id)->first(); }# 方法 2: 過濾,傳遞一個模型作為回調(diào) foreach($searchForTheseUsers as $searchUser) {$result = $users->filter(function($user) use ($searchUser) {return $user->id === $searchUser->id;})->first(); }# 方法 3: 過濾,傳遞屬性作為回調(diào) foreach($searchForTheseUsers as $user) {$searchId = $user->id;$result = $users->filter(function($user) use ($searchId) {return $user->id === $searchId;})->first(); }

    以上三個方法都會被用來測試過濾 1 個屬性,2 個屬性,3 個屬性,所以,用方法 1 過濾三個屬性就會是這樣:

    foreach($searchForTheseUsers as $user) {$result = $users->where('id', '=', $user->id)->where('firstname', '=', $user->firstname)->where('lastname', '=', $user->lastname)->first(); }

    結(jié)果

    方法 #1方法 #2方法 #3
    1個屬性0.1900.139 (-27%)0.072 (-62%)
    2個屬性0.4990.372 (-25%)0.196 (-61%)
    3個屬性0.4880.603 (+25%)0.198 (-59%)

    結(jié)論

    我們可以得出結(jié)論:對一個項目而言,重復的過濾一個大集合會引發(fā)嚴重性能瓶頸。

    多屬性的過濾明顯增加計算成本。

    使用 Collection::filter() 代替?Collection::where() 可以提高60%的性能。

    警告:傳遞完整的模型給過濾器回調(diào)是很耗費性能的,最好是傳遞單獨的屬性。

    致謝

    感謝 Spatie 和 spatie/laravel-permissions?的貢獻者創(chuàng)建如此優(yōu)秀的包,我非常喜歡使用!感謝 Andru Beldie?指出這些性能問題,我才有機會對其進行調(diào)查和糾正。

    鏈接

    • spatie/laravel-permission package.
    • Issue #550 addressing performance problem.
    • Pull request #710 that fixes problems.

    更多現(xiàn)代化 PHP 知識,請前往 Laravel / PHP 知識社區(qū)

    轉(zhuǎn)載于:https://www.cnblogs.com/summerblue/p/9176947.html

    總結(jié)

    以上是生活随笔為你收集整理的记一次对 Laravel-permission 项目的性能优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。