Speedup für die Funktion checkCatPermission
Verfasst: Fr 7. Jul 2006, 20:46
Hallo zusammen,
habe mir mal die Funktion checkCatPermission in der 'cms/includes/functions.navigation.php' unter die Lupe genommen.
In der Funktion wird bei jedem Aufruf eine neue Instanz von $FrontendPermissionCollection erstellt und die Liste $groups gefüllt. Dies ist eigentlich nur einmal nötig, da diese Daten sich pro Scriptaufruf nicht ändern.
Daher habe ich den Code etwas optimiert und aus $FrontendPermissionCollection und $groups statische Variablen gemacht, die nur einmal gesetzt werden.
Das Ergebnis bei mir war eine um ca. 80% schnellere Abarbeitung von 50 Kategorien, die geschützt sind in Verbindung mit 5 vorhandenen Frontendgruppen und einem angemeldeten Frontend-User. Bei einem nicht angemeldeten Frontenduser wird der Code um 40% schneller abgearbeitet.
Beispiel einer Debug-Ausgabe:
Die neue Funktion:
Auch wenn es in der Praxis selten vorkommt, dass 50 geschützte Kategorien vorhanden sind, ist das Ergebnis trotzdem vielversprechend und verkürzt die Generierung der Hauptnavigation um Einiges.
Grüße
xmurrix
habe mir mal die Funktion checkCatPermission in der 'cms/includes/functions.navigation.php' unter die Lupe genommen.
In der Funktion wird bei jedem Aufruf eine neue Instanz von $FrontendPermissionCollection erstellt und die Liste $groups gefüllt. Dies ist eigentlich nur einmal nötig, da diese Daten sich pro Scriptaufruf nicht ändern.
Daher habe ich den Code etwas optimiert und aus $FrontendPermissionCollection und $groups statische Variablen gemacht, die nur einmal gesetzt werden.
Das Ergebnis bei mir war eine um ca. 80% schnellere Abarbeitung von 50 Kategorien, die geschützt sind in Verbindung mit 5 vorhandenen Frontendgruppen und einem angemeldeten Frontend-User. Bei einem nicht angemeldeten Frontenduser wird der Code um 40% schneller abgearbeitet.
Beispiel einer Debug-Ausgabe:
Code: Alles auswählen
number of frontend groups 5
numer of nonpublic cats: 50
checkCatPermission old: 2.3171648979187
checkCatPermission new : 0.38882112503052
timediff: 1.9283437728882
percent: 83.219963094566
Code: Alles auswählen
function checkCatPermission($idcatlang, $public) {
//check if current user has permissions to access cat
cInclude('classes','class.frontend.permissions.php');
cInclude('classes','class.frontend.groups.php');
cInclude('classes','class.frontend.users.php');
global $auth;
// define $groups and $FrontendPermissionCollection as static
// because of performance reasons
static $groups;
static $FrontendPermissionCollection;
if (!isset($FrontendPermissionCollection)) {
// create objec only once
$FrontendPermissionCollection = new FrontendPermissionCollection;
}
$visible = false;
if ($public != 0) {
$visible = true;
} elseif (($auth->auth['uid'] != '') && ($auth->auth['uid'] != 'nobody')) {
if (!isset($groups)) {
// this part is to proceed oly once, we need to fill groups array
$FrontendGroupMemberCollection = new FrontendGroupMemberCollection;
$FrontendGroupMemberCollection->setWhere('idfrontenduser', $auth->auth['uid']);
$FrontendGroupMemberCollection->query();
$groups = array();
while ($member = $FrontendGroupMemberCollection->next()) {
$groups[] = $member->get('idfrontendgroup');
}
}
// check access permission on if groups array has any entries
if (count($groups)>0) {
for ($i=0; $i<count($groups); $i++) {
if ($FrontendPermissionCollection->checkPerm($groups[$i], 'category', 'access', $idcatlang, true)) {
$visible = true;
break;
}
}
}
}
return $visible;
} // function checkCatPermission()
Grüße
xmurrix