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