User Klasse langsam

Hast du Probleme Admidio einzurichten? Hier kannst du Fragen rund um die Einrichtung stellen.
Antworten
ukos
Beiträge: 13
Registriert: 13. Mär 2010, 17:43
Kontaktdaten:

User Klasse langsam

Beitrag von ukos »

Hallo.
Entweder mach ich hier was falsch, oder die User-Klasse ist einfach schlichtweg zu langsam.
Die Ergebnisse meines php-Dokuments werden nur sehr langsam nach und nach aufgebaut, wenn ich für jeden Datensatz erstmal ein user-Objekt erstelle und mir dann von diesem die Daten hole.
Wenn ich dagegen den SQL-String benutze, aus dem ich die usr_id beziehe, so wird dies relativ fix aufgebaut.
Muss ich eventuell irgendwas mit dem user-Objekt machen, nachdem ich es benutzt habe? - Eventuell löschen oder user->clear() ??

Mein Code (Der sql befehl ist gekürzt):

Code: Alles auswählen

require('../../system/common.php');
require('../../system/login_valid.php');

$sql    = 'SELECT usr_id FROM '. TBL_USERS. ' LIMIT 40';

$result_mgl  = $g_db->query($sql);
$num_members = $g_db->num_rows($result_mgl);

// Html-Kopf ausgeben
$g_layout['title']  = 'Kontoeinzugsermächtigung';
$g_layout['header'] = '';

require(THEME_SERVER_PATH. '/overall_header.php');
if($num_members > 0)
{
    while($row = $g_db->fetch_array($result_mgl))
    {
	echo $row[last_name];
	$user = new User($g_db, $row[usr_id]);
	#echo $user->getValue('Nachname');
	echo "<br />";
	$user->clear();
	}
}

require(THEME_SERVER_PATH. '/overall_footer.php');
Danke bis hierhin erstmal
Benutzeravatar
fasse
Administrator
Beiträge: 6170
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Hallo Ukos,

für das was du machen willst, ist das UserObjekt in der Tat zu langsam bzw. nicht angedacht.
Das Userobjekt liest noch einmal nachträglich alle Daten eines Users ein. Das heißt für jeden User werden noch einmal ca. 2-3 SQL-Statements abgesetzt. Hinzu kommt dann noch auf PHP-Seite jedesmal das Anlegen eines neuen Objekts pro User.

Hier wäre es wirklich sinnvoller die Daten direkt über ein komplexeres SQL-Statement alle einzulesen. So machen wir es auch in den Listen.

Gruß
Fasse
ukos
Beiträge: 13
Registriert: 13. Mär 2010, 17:43
Kontaktdaten:

Beitrag von ukos »

Ja. Ist nicht die beste Möglichkeit. Per direktem sql-Befehl gehts viel fixer.
Bin allerdings nicht drumrumgekommen, die User-Klasse zu benutzen, da ich ca. 7 Eigenschaften gebraucht habe. Das ist dann mit den vielen JOIN Befehlen schon ganz schön nervig.
Beim CSV-Upload ist übrigens das gleiche Problem. Dort dauert das Einlesen von 300 Datensätzen auch etwas länger, da auch hier immer eine neue User-Klasse gesetzt wird.
Ich habe mir jetzt so abgeholfen, dass ich per ini-set die max-execution-time hochgesetzt habe und zudem eine hübsche Progress-Bar eingebaut hab, die per Javascript funktioniert.

Ich bin gerade dabei, mir ein Modul zu erstellen, das die Bankeinzugs-Datei aus der Datenbank heraus erstellt (Datenträger-Austausch-Format DTAU). Ich glaube, das wurde hier an anderer Stelle auch schon mal gewünscht.
Wen es interessiert, dem kann ich den Quellcode geben. Der ist allerdings auf meine BLZ und Kontodaten-Felder angepasst. Zudem auf meine Folder-IDs usw. Geb mir allerdings Mühe, dass ich das evtl mal hier für jedermann benutzbar posten kann.

--Problem erstmal gelöst--
Antworten