Speedup für die Funktion checkCatPermission

Gesperrt
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Speedup für die Funktion checkCatPermission

Beitrag 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
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Klingt gut, nach Bugs verschoben, damit es nicht vergessen wird.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Gesperrt