Seite 1 von 1

Speedup für die Funktion checkCatPermission

Verfasst: Fr 7. Jul 2006, 20:46
von xmurrix
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:

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
Die neue Funktion:

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()
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

Verfasst: Fr 7. Jul 2006, 21:24
von HerrB
Klingt gut, nach Bugs verschoben, damit es nicht vergessen wird.

Gruß
HerrB