Datenbank organisation mit PHP
Rafael
- php
Ich hätte mal eine Frage zu performance Angelegenheiten.
Ich bastle momentan an einer Art Datenbankverwaltung. Dazu habe ich nun eine Klassenbibliothek erstellt, damit auch "weniger versierte" mit den Funktionen arbeiten können. Zum Beispiel liest eine Funktion eine Tabelle aus und erstellt automatisch ein Forumlar in welches man einen neuen Datensatz eintragen kann und stellt dies im Browser dar. Dazu werden noch aus einem Array Display-Namen für die Felder gesucht und noch einige Komfortarbeiten etc.
Nun kann es aber sein, dass innerhalb einer Datei mehrere Funktionen angewendet werden. Jede einzelne Funktion erstellt nun dabei eine eigene Verbindung zur Datenbank und trennt diese nach ausführen der Funktion wieder.
Ist das effizient? Ich habe das Gefühl, dass man das auch ressourcensparender durchführen könnte...
Aber muss ich dann die Verbindungsvariable mit "global" in jede Funktion hohlen und am Ende einfach die Verbindung trennen?
Ich hab mich schon mit dem Schlagwort persistente Datenbankverbindung auseinandergesetzt, aber irgendwie habe ich das Gefühl hier auch am falschen Dampfer zu sein.
Ach ja: Ich benutze MySQL 5.
Danke für jede Hilfe!
echo $begrüßung;
Jede einzelne Funktion erstellt nun dabei eine eigene Verbindung zur Datenbank und trennt diese nach ausführen der Funktion wieder.
Ist das effizient? Ich habe das Gefühl, dass man das auch ressourcensparender durchführen könnte...
Natürlich nicht und ja.
Ach ja: Ich benutze MySQL 5.
Die MySQL-Version ist hier egal. Das Prinzip ist bei jeder Datenbank und Version gleich. Interessanter wäre die PHP-Version, denn hier gibt es Unterschiede was die Möglichkeiten der OOP angehen.
Aber muss ich dann die Verbindungsvariable mit "global" in jede Funktion hohlen und am Ende einfach die Verbindung trennen?
Es gibt programmiertechnische Muster, die dir helfen können, das Problem zu lösen. Beispielsweise das Singleton-Muster. Normalerweise wird es angewendet, wenn es nur genau eine Instanz einer Klasse geben darf. Aber auch für eine Datenbankverbindung kann man es verwenden.
Möchte man eine Verbindung haben, ruft man eine Funktion auf (z.B. getConnection genannt). Diese sorgt dafür, dass die schon bestehende Verbindung zurückgegeben wird. Gibt es noch keine, wird zuvor eine neue erzeugt und intern gemerkt.
Für PHP4 kann man eine Variable als static deklarieren, die mit null initialisiert wird und später die Verbindung zugewiesen bekommt. Unter PHP5 kann man eine statische Klassenvariable für den Zweck verwenden. Beide Vorgehensweisen haben den Vorteil, dass man keine globale Variable rumliegen hat.
Um die Beendigung der Verbindung musst du dich im Allgemeinen nicht kümmern, das passiert am Scriptende automatisch.
Ich hab mich schon mit dem Schlagwort persistente Datenbankverbindung auseinandergesetzt, aber irgendwie habe ich das Gefühl hier auch am falschen Dampfer zu sein.
Man kann Verbindungen auch nach Scriptende offen halten (Stichwort mysql_pconnect()), aber dazu braucht man PHP als Apache-Modul und ... diese Antwort von Sven Rautenberg.
echo "$verabschiedung $name";
Okay, ersteres habe ich mir fast schon gedacht. Aber die Lösung mit den static Variablen verstehe ich noch nicht ganz.
Diese gilt dann doch nur in der Funktion in der ich die static Variable aufgerufen habe. Wenn ich nun zwei Funktionen habe, die beide auf die Datenbank zugreifen, dann gilt die Verbindung doch nur für die Funktion in der ich die Verbindung öffne.
Oder nicht?
Wenn ich zum Beispiel eine Seite erstelle in der erst eine Übericht einer Tabellenzeile steht (bei mir print_summary('gruppe',$id);) und darunter eine Liste für eine neue verknüfte Zeile in der selben Datenbank aber in einer anderen Tabelle ausgeben will (hier print_new('teilnehmer',$id);) dann würde mir static doch nur etwas bringen wenn ich zweimal print_summary(); aufrufe.
In diesem Fall aber habe ich keinerlei Ersparnis, obwohl beide Funktionen auf die selbe Datenbank zugreifen.
Danke aber soweit schon mal.
Grüße!
echo $begrüßung;
Okay, ersteres habe ich mir fast schon gedacht. Aber die Lösung mit den static Variablen verstehe ich noch nicht ganz.
Diese gilt dann doch nur in der Funktion in der ich die static Variable aufgerufen habe. Wenn ich nun zwei Funktionen habe, die beide auf die Datenbank zugreifen, dann gilt die Verbindung doch nur für die Funktion in der ich die Verbindung öffne.Oder nicht?
Du schreibst noch eine dritte Funktion, die sich um die Erzeugung einer Datenbankverbindung kümmert. Beispielsweise so (PHP4-kompatible Variante):
function getConnection() {
static $connection = null;
if ($connection === null)
$connection = // konnektiere DB (angemessenen Reaktion im Fehlerfall nicht vergessen)
return $connection;
}
An allen Stellen, an denen du nun eine Verbindung benötigst, holst du sie dir über einen Aufruf von getConnection:
$connection = getConnection();
query($connection, $sql);
...
echo "$verabschiedung $name";
Hätte ich selbst drauf kommen können. Danke!