31
JAN09Webseiten mehrsprachig programmieren
4. Einzelne Variablen
Einzelne Variablen für jede Textposition zu erstellen klang für mich am effizientesten. Wenn man sich z.B. mal die Sprachdatei von phpMyAdmin anschaut, findet man diese Variante vor, nur mit nicht ganz sovielen Textpositionen. (~1500) Schauen wir uns nun den Aufbau der Sprachdatei an:
1 2 3 4 5 |
$LANG_XYZ0 = 'Test string0'; ... $LANG_XYZ9999 = 'Test string9999'; |
Folgende Messwerte kamen hier zustande:
Mem start: 66.41 kb
Mem nach einlesen: 1208.66 kb
Mem nach Stringsuche: 1208.85 kb
Zeit zum einlesen der Datei: 0.176165 s
Zeit der Ausgabe: 0.000063 s
Der Zugriff auf eine direkt Variable ist hier auch der einzige Vorteil dieser Variante :/ Wir sind hier bei der Ausgabe ganze 0.000010 Sekunden schneller aber dafür beim einlesen der Datei um das 4fache langsamer oO das ist heftig und damit hatte ich auch nicht gerechnet. Man sollte also an die einzelne Variablen Technik besser nicht denken. Bleibt uns nur noch ein Test, der Konstanten!
5. Konstante
Alle Augen nun auf die Konstanten, werden sie schneller eingelesen? Schneller gefunden und ausgegeben und verbrauchen relativ wenig Speicher? Schauen wir uns einmal den Aufbau solch einer Datei an:
1 2 3 4 5 |
define('LANG_XYZ0','Test string0'); ... define('LANG_XYZ9999','Test string9999'); |
Was sagen hier nun die Messwerte *trommelWirbel*
Mem start: 66.57 kb
Mem nach einlesen: 363.81 kb
Mem nach Stringsuche: 363.96 kb
Zeit zum einlesen der Datei: 0.060518 s
Zeit der Ausgabe: 0.000062 s
hmm ich weiß nicht ob ich da überhaupt noch was zu sagen muss :D Wir sehen hier eine Ausgabe von 0.000062, die der einzelnen Variablen aber zusätzlich eine Einbindungszeit der Arrays und der dritte vorteil, diese Variante verbraucht nur gut 1/3 des Speichers der anderen … Also ?!?
6. Fazit
Wenn wir uns das alles jetzt noch mal in ruhe anschauen dann fällt der Pokal eindeutig den Konstanten in die Hände. Sie sind einfach schnell in der Ausgabe, das einlesen geht recht fix und sie verbrauchen wenig Speicher, dazu kommt noch das eine Variable die mit define definiert wurde konstant ist, d.h. ein Programmierer hat nicht die Möglichkeit diese Variable irgendwie abzuändern und somit nicht die mittel die Sprachdatei zur Laufzeit in irgendeiner Art und Weise zu verändern. Natürlich ist solch eine Methode für einen Kunden nicht zu tragen, man kann nicht von ihm verlangen eine php-Datei zu öffnen und dort die Texte zu ändern, da empfiehlt sich dann doch die MySQL variante.
Habt ihr vielleicht mehr Erfahrung mit mehrsprachigen Webseiten? oder einen anderen schnelleren Weg dann lasst es mich bitte wissen.





9 Kommentare
Keeewl… danke, dass des mal jemand getestet hat, zum Glück gehts mit Konstanten am besten
Zu der Editierungsmöglichkeit die ja für den fiktiven Kunden am besten bei MySQL gegeben ist. Hier könnte man mit ein bisschen regexen sicherlich auch eine Bearbeitungsmaske für eine Konstanten definierende Datei schaffen, oder aber einen Spiegel des ganzen in MySQL lagern, und dann daraus die zu inkludierende Datei mit den Konstanten generieren, so hätte man von beiden Varianten die Vorteile ausgeschöpft
Greetz
Hey Kolja,
ja die Idee mit der Eingabe der Konstanten über die MySQL hört sich nett an
coole Sache
Wenn man aber alle Einträge erst aus der MySQL Datenbank ausliest und dann in eine Konstante setzt, könnte ich mir vorstellen, dass auch viel Zeit und Speicher dabei drauf geht.
Ich sitze im moment auch vor dem Problem, ein mehrsprachiges System zu erstellen, und bin mir au ch noch unschlüssig wie ich es mache. Im Moment tendiere ich aber zu gettext, was du übrigens nicht erwähnt hast
Hi Markus,
wenn man dieses auslesen dann nur einmalig macht und nicht bei jedem Seitenaufruf dann wäre dies die Lösung für die Theorie von Kolja und mir
Willst du dann dynamisch ne PHP Datei generieren, die dies dann übernimmt? Die Lösung würd mir nicht so wirklich gefallen
Naja das ganze würde nur richtig sinn machen bei großen Seiten die dynamisch die Texte pflegen wollen wie im Beispiel, bei kleineren Seiten kannst es auch von der DB aus zur Laufzeit immer in defines packen.
Ich meine nur, der SQL Query wäre an dieser Stelle unnötig denn man könnte es ja anderster machen.
Es geht um ein großes Projekt, deswegen is mir die Optimierung sehr wichtig
Schau mal, angenommen wir haben eine Seite mit etwa 200-300 Textpositionen die dann in der Datenbank stehen würden. Du hättest zunächst einen Query der dir ein ResultSet von diesen 200-300 Rows zurück gibt (nicht grad wenig) Als nächstes müsstest du eine Schleife machen die dir alle Werte in eine Konstante packt. Meiner Meinung nach sind das gleich 2 dicke negative Punkte es nicht auf diesen Weg zu machen. Selbst wenn du an dieser Stelle dann QueryCache oder Memcache benutzt haben wir ein Array mit der Anzahl der Textpositionen, dieses müsstest du dennoch schleifen um die Konstanten zu bekommen, dass ist aber dann gleich doppelt gemobbelt, da kannste ja gleich die Sprachsteuerung über Arrays machen
Hast Du schon mal gettext probiert?
Kommentar schreiben