Schnelle On-The-Fly Generierung einer eigenen Mitgliedsliste

Alles, was nicht in die anderen Foren passt, kannst du hier loswerden.
Antworten
superminis
Beiträge: 119
Registriert: 30. Jun 2008, 20:05
Wohnort: Baden
Kontaktdaten:

Schnelle On-The-Fly Generierung einer eigenen Mitgliedsliste

Beitrag von superminis »

Hallo @all,

vor weit über einem Jahr wurde mir hier im Forum ein Codeschnipsel zur Verfügung gestellt den ich zum Anzeigen der Ministranten auf unserer Website nutze.

Nun ist mir aber aufgefallen dass bei gut 35 Minis die Seite ewig lange lädt.

Das wäre kein Problem, wenn nicht die Seite ZUERST 35 Sekunden laden würde, in denen ich nur den Hintergrund der Seite sehe, und dann der Inhalt angezeigt wird, wobei dann die Fotos erst noch nachgeladen werden müssen, wodurch mit einer Ladezeit von locker 60 Sekunden gerechnet werden muss - so lange wollen die Benutzer aber verständlicherweise nicht warten. Ich poste jetzt einfach einmal den aktuellen Code (der vermutlich inzwischen nicht mehr valide ist, aber das lassen wir jetzt einmal fürs erste beiseite, weil ich die verwendeten Elemente, divs, p-Elemente etc. sowieso nochmal überdenken muss nachdem jetzt neue Menüpunkte dazukommen. Vielleicht hat jemand eine Idee wie man das beschleunigen könnte.

Code: Alles auswählen

<?php

require("/var/www/kunden/superminis/web/adm_program/system/common.php");

//header ('Content-type: text/html; charset=utf-8');

echo('<h2>Unsere Ministranten</h2>');

echo ('<div id="zweidivcenter">');

echo ('<div id="bdiv">');

$var = array(3, 1, 2, 7, 8); //Buben

foreach($var as $Person) {     /* in der Variable $Person wird immer die ID des Minis kopiert */
     //echo $Person;
     
	 $user = new User($g_db, $Person); 
	 
	 echo ('<div class="rahmen">');
	 
	 echo ('<div class="title"><strong>');
	 
	$gdt = $user->getValue('Geburtstag');
	
	if ($gdt <> "") {
	$teile = explode("-", $gdt);

	$tag = $teile[2];
	$monat = $teile[1];
	$jahr = $teile[0];

	$time = mktime(0,0,0,date("m"),date("d"),date("Y")); 
	$birthday = mktime(0,0,0,$monat,$tag,$jahr); 
	$alter   = intval(($time - $birthday) / (3600 * 24 * 365));
	
	}
	
	else
	
	{
	$alter = '?';
	}
	
	
		 if($g_valid_login == 1) {
		$g_db->setCurrentDB();
		
		
		if($g_current_user->isWebmaster()) {
		
		echo '<a href="members/adm_program/modules/profile/profile_new.php?user_id=' . $Person .'" rel="floatbox" title="Profil bearbeiten" rev="width:640 height:480 scrolling:auto theme:blue"><img src="images/edit.png" width="16" height="16" alt ="Profil bearbeiten" title="Profil bearbeiten" /></a>&nbsp;<a href="members/adm_program/modules/profile/profile_photo_edit.php?usr_id='.$Person.'" rel="floatbox" rev="width:640 height:480 scrolling:auto theme:blue"><img src="images/photo_upload.png" alt="Foto hochladen" title="Foto hochladen"></a>&nbsp;';
				
		}
		
		else
		
		{
		
		
		if ($Person == $g_current_user->getValue("usr_id"))
		{		
		echo '<a href="members/adm_program/modules/profile/profile_new.php?user_id=' . $Person .'" rel="floatbox" title="Profil bearbeiten" rev="width:640 height:480 scrolling:auto theme:blue"><img src="images/edit.png" width="16" height="16" alt ="Profil bearbeiten" title="Profil bearbeiten" /></a>&nbsp;<a href="members/adm_program/modules/profile/profile_photo_edit.php?usr_id='.$Person.'" rel="floatbox" rev="width:640 height:480 scrolling:auto theme:blue"><img src="images/photo_upload.png" alt="Foto hochladen" title="Foto hochladen"></a>&nbsp;';

		}
		
		}
		
	 
	 }
	 
	 
	 
	 echo ('<a name="'. $user->getValue('Vorname').$user->getValue('Nachname').'" class="anker">' . $user->getValue('Vorname'). ' '. $user->getValue('Nachname') . '</a> (' . $alter . ' Jahre)');
	 
	 if($user->getValue('Homepage') != "") {
	 echo '&nbsp;<a href="' . $user->getValue('Homepage') . '" target="_blank"><img src="gb/weblinks.png" alt="Homepage" /></a>';
	 } else {
	 //echo "Keine Hobbies angegeben";
	 } 
	 
	 echo ('</strong></div>');
	 
	  //echo ('<dl class="mini subpic"><dt><img src="foto.php?a_user_id=' . $Person  . '" alt="' . $user->getValue('Vorname'). ' '. $user->getValue('Nachname') . '" width="92px" /></dt></dl>');
		
		if ($Person == $g_current_user->getValue("usr_id"))
		{		
		echo '<dl class="mini subpic"><dt><iframe allowtransparency="true" src="minis/foto.php"  height="122px" width="92px" frameborder="0" scrolling="no" ></iframe></dt></dl>';
		} else {
		echo '<dl class="mini subpic"><dt><img src="foto.php?a_user_id=' . $Person  . '" alt="' . $user->getValue('Vorname'). ' '. $user->getValue('Nachname') . '" width="92px" /></dt></dl>';
		}
		
	 echo ('<br />');	 
	 
	 //echo ('<img src="ministranten/foto.php?user=');
	 //echo ($Person);
	   
	 if($user->getValue('Hobbies') != "") {
	 echo '<b>Hobbies:</b> ' . $user->getValue('Hobbies');
	 
	 
	 } else {
	 echo "<i>Keine Hobbies angegeben</i>";
	 } 
	 
	if ($user->getValue('Facebook-UID') <> "") {
		echo('<p><a href="fb.php?id='.$user->getValue('Facebook-UID').'" target="_blank"><img src="images/fb.png" alt="" /></a></p>');
	}
	
	             if($user->getValue('usr_usr_id_change') > 0)
                {
                    $user_change = new User($g_db, $user->getValue('usr_usr_id_change'));
                    echo '<br />Letzte &Auml;nderung: '. mysqldatetime('d.m.y', $user->getValue('usr_timestamp_change'));
                }
	 
	 echo ('</div>');
	 

 	 
	 echo "<br />\n";
	 
}

echo ('</div>');

echo ('<div id="mdiv">');

$var = array(10, 5, 4, 6, 9); //Mädchen

foreach($var as $Person) {     /* in der Variable $Person wird immer die ID des Minis kopiert */
     //echo $Person;
     
	 $user = new User($g_db, $Person); 
	 
	 echo ('<div class="rahmen">');
	 
	 
	 echo ('<div class="title"><strong>');
	 
	$gdt = $user->getValue('Geburtstag');
	
	if ($gdt <> "") {
	$teile = explode("-", $gdt);

	$tag = $teile[2];
	$monat = $teile[1];
	$jahr = $teile[0];

	$time = mktime(0,0,0,date("m"),date("d"),date("Y")); 
	$birthday = mktime(0,0,0,$monat,$tag,$jahr); 
	$alter   = intval(($time - $birthday) / (3600 * 24 * 365));
	
	}
	
	else
	
	{
	$alter = '?';
	}
	
	
	 if($g_valid_login == 1) {
		$g_db->setCurrentDB();
		
		
		if($g_current_user->isWebmaster()) {
		
		echo '<a href="members/adm_program/modules/profile/profile_new.php?user_id=' . $Person .'" rel="floatbox" title="Profil bearbeiten" rev="width:640 height:480 scrolling:auto theme:blue"><img src="images/edit.png" width="16" height="16" alt ="Profil bearbeiten" title="Profil bearbeiten" /></a>&nbsp;<a href="members/adm_program/modules/profile/profile_photo_edit.php?usr_id='.$Person.'" rel="floatbox" rev="width:640 height:480 scrolling:auto theme:blue"><img src="images/photo_upload.png" alt="Foto hochladen" title="Foto hochladen"></a>&nbsp;';
				
		}
		
		else
		
		{
		
		
		if ($Person == $g_current_user->getValue("usr_id"))
		{		

		echo '<a href="members/adm_program/modules/profile/profile_new.php?user_id=' . $Person .'" rel="floatbox" title="Profil bearbeiten" rev="width:640 height:480 scrolling:auto theme:blue"><img src="images/edit.png" width="16" height="16" alt ="Profil bearbeiten" title="Profil bearbeiten" /></a>&nbsp;<a href="members/adm_program/modules/profile/profile_photo_edit.php?usr_id='.$Person.'" rel="floatbox" rev="width:640 height:480 scrolling:auto theme:blue"><img src="images/photo_upload.png" alt="Foto hochladen" title="Foto hochladen"></a>&nbsp;';

		}
		
		}
		
	 
	 }
	 
	 
	 
	echo ('<a name="'. $user->getValue('Vorname').$user->getValue('Nachname').'" class="anker">' . $user->getValue('Vorname'). ' '. $user->getValue('Nachname') . '</a> (' . $alter . ' Jahre)');
	 
	 if($user->getValue('Homepage') != "") {
	 echo '&nbsp;<a href="' . $user->getValue('Homepage') . '" target="_blank"><img src="gb/weblinks.png" alt="Homepage" /></a>';
	 } else {
	 //echo "Keine Hobbies angegeben";
	 }  
	 
	 echo ('</strong></div>');
	 
	 echo ('<dl class="mini subpic"><dt><img src="foto.php?a_user_id=' . $Person  . '" alt="' . $user->getValue('Vorname'). ' '. $user->getValue('Nachname') . '" width="92px" /></dt></dl>');

	 
	 echo ('<br />');
	 
	 //echo ('<img src="ministranten/foto.php?user=');
	 //echo ($Person);
	  
	 if($user->getValue('Hobbies') != "") {
	 echo '<b>Hobbies:</b> ' . $user->getValue('Hobbies');	 
	 } else {
	 echo "<i>Keine Hobbies angegeben</i>";
	 } 
	 
	if ($user->getValue('Facebook-UID') <> "") {
		echo('<p><a href="fb.php?id='.$user->getValue('Facebook-UID').'" target="_blank"><img src="images/fb.png" alt="" /></a></p>');
	}
	
		         if($user->getValue('usr_usr_id_change') > 0)
                {
                    $user_change = new User($g_db, $user->getValue('usr_usr_id_change'));
                    echo '<br />Letzte &Auml;nderung: '. mysqldatetime('d.m.y', $user->getValue('usr_timestamp_change'));
                }
	 
	 echo ('</div>');
 
	 echo "<br />\n";
	 
}

echo ('</div></div>')

?>
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Hallo auch,

wie schon an anderer Stelle hier im Forum festgestellt wurde, ist die Userklasse "schuld" daran. Das ist in Deinem Code die Zeile

Code: Alles auswählen

$user = new User($g_db, $Person); 
Wenn ein neues Userobjekt angelegt wird, werden im Hintergrund einige SQL Abfragen abgesetzt, um z.B. die ganzen Stammdaten zum User einzulesen. Damit ist dann auf einem einzelnen Userobjekt der Zugriff auf seine Eigenschaften deutlich schneller. Bedeutet aber auch, dass ein mehrfach aufgerufenes Userobjekt (wie in Deinem Fall) die Performance drückt. Denn dafür ist es theoretisch nicht konzipiert.

Wie kann man das beschleunigen? Wenn klar ist, welche Daten Du aus der Datenbank benötigst rate ich zu einer eigenen (u.U. komplexen) SQL Abfrage. Damit würdest Du nur einmal die Datenbank ansprechen und in einem Rutsch die Daten auslesen. Das dürfte für Deinen Fall einen deutlichen Geschwindigkeitsvorteil bringen.

Gruss,
Matze
superminis
Beiträge: 119
Registriert: 30. Jun 2008, 20:05
Wohnort: Baden
Kontaktdaten:

Beitrag von superminis »

Danke matze,

ich hatte fast befürchtet dass es daran liegt.

Kannst du mir helfen, das SQL-Statement und die Verarbeitung zu basteln? Ich bin da nicht wirklich fit.

Ich muss die folgenden Informationen auslesen:

Vorname, Nachname, Alter (aus Geburtsdatum), Hobbies, Facebook-UID (Benutzerfeld), Benutzer-ID (für Foto bzw. Bearbeiten-Link), Letzte Änderung.
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Hi auch,

so auf die schnelle müsste das irgendwas in dieser Richtung sein:

Code: Alles auswählen

SELECT usd_value, usr_id, usr_usr_id_change, usr_timestamp_change
FROM adm_user_fields, adm_user_data, adm_users
WHERE usf_name
IN ('Nachname', 'Vorname', 'Geburtstag', 'Hobbies', 'Facebook-UID')
AND usd_usf_id = usf_id
AND usd_usr_id = usr_id
Das ist allerdings das reine SQL Statement, was man noch in PHP umsetzen müsste. Den Inhalt der Abfrage müsste man dann in eine Schleife packen und die einzelnen Felder wieder auslesen. Ist etwas umständlich, weil im Feldinhalt usd_value alle wirklichen Daten drinen stehen. Also als Beispiel bekommst Du für einen User Max Mustermann, am 10.01.1980 geboren, mit dem Hobby Inlineskaten, der Facebook ID 0815 und zuletzt durch den User 1 heute geändert folgende Ausgabe:

Code: Alles auswählen

usf_name = Nachname
usd_value = Mustermann
usr_id = 90
usr_usr_id_change = 1
usr_timestamp_change = 2010-03-25 09:00:00
usf_name = Vorname
usd_value = Max
usr_id = 90
usr_usr_id_change = 1
usr_timestamp_change = 2010-03-25 09:00:00
usf_name = Geburtstag
usd_value = 1980-01-10
usr_id = 90
usr_usr_id_change = 1
usr_timestamp_change = 2010-03-25 09:00:00
usf_name = Hobbies
usd_value = Inlineskating
usr_id = 90
usr_usr_id_change = 1
usr_timestamp_change = 2010-03-25 09:00:00
usf_name = Facebook-UID
usd_value = 0815
usr_id = 90
usr_usr_id_change = 1
usr_timestamp_change = 2010-03-25 09:00:00
Du siehst,da ist noch ein bischen was zu tun. Die SQL Abfrage lässt sich noch verfeinern, aber das wäre schonmal eine Variante...

Gruss,
Matze
superminis
Beiträge: 119
Registriert: 30. Jun 2008, 20:05
Wohnort: Baden
Kontaktdaten:

Beitrag von superminis »

Danke. Dann werde ich mal schauen ob ich das umsetzen kann.
Antworten