Maison > Article > développement back-end > Optimisation des performances pour le projet d'autorisation Laravel
Cet article présente principalement l'optimisation des performances du projet Laravel-permission, qui a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer
<.>J'ai récemment étudié et analysé les performances des projets créés sur SWIS. Étonnamment, l’une des méthodes les plus gourmandes en performances est due à l’excellent package. spatie/laravel-permission
cela fait principalement deux choses : spatie/laravel-permission
$permission = $permissions ->where('id', $id) ->where('guard_name', $guardName) ->first();Après modification :
$permission = $permissions ->filter(function ($permission) use ($id, $guardName) { return $permission->id === $id && $permission->guard_name === $guardName; }) ->first();Ces deux extraits de code réalisent la même chose, mais le second est plus rapide. Tests de performancesIl existe environ 150 autorisations différentes dans l'application que je développe. Dans une requête normale, environ 50 autorisations doivent être vérifiées à l'aide de la méthode
. Bien entendu, certaines pages peuvent devoir vérifier environ 200 autorisations. hasPermissionTo
$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: 过滤,传递一个模型作为回调 foreach($searchForTheseUsers as $searchUser) { $result = $users->filter(function($user) use ($searchUser) { return $user->id === $searchUser->id; })->first(); } # 方法 3: 过滤,传递属性作为回调 foreach($searchForTheseUsers as $user) { $searchId = $user->id; $result = $users->filter(function($user) use ($searchId) { return $user->id === $searchId; })->first(); }Les trois méthodes ci-dessus seront utilisées pour tester le filtrage de 1 attribut, 2 attributs et 3 attributs. Par conséquent, l'utilisation de la méthode 1 pour filtrer trois attributs ressemblera à ceci : <.>Résultats
foreach($searchForTheseUsers as $user) { $result = $users ->where('id', '=', $user->id) ->where('firstname', '=', $user->firstname) ->where('lastname', '=', $user->lastname)->first(); }Conclusion
方法 #1 | 方法 #2 | 方法 #3 | |
---|---|---|---|
1个属性 | 0.190 | 0.139 (-27%) | 0.072 (-62%) |
2个属性 | 0.499 | 0.372 (-25%) | 0.196 (-61%) |
3个属性 | 0.488 | 0.603 (+25%) | 0.198 (-59%) |
Le filtrage multi-attributs augmente considérablement le coût de calcul.
L'utilisation de
au lieu de peut améliorer les performances de 60 %. Collection::filter()
Collection::where()
Attention : Passer le modèle complet au rappel du filtre est très gourmand en performances, il est préférable de passer des attributs individuels.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
Utilisation de la requête de base de données coroutine de Swoole dans Laravel 5.6Analyse du système d'apparence de façade de LaravelLaravel+Redis implémente simplement un traitement à haute concurrence des files d'attente qui réussit le test de résistanceCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!