Ik onderhoud een vrij groot webbased projectmanagementsysteem dat is geschreven in PHP en gebruik maakt van een mysql-database. Project informatie wordt in 1 taal opgeslagen maar vaste elementen (labeltjes van velden, foutmeldingen, kortom alles wat met de user interface te maken heeft) is in vier talen beschikbaar.
Er is een functie translate( 'engels tekstje' ) die een select doet op een translate tabel. Als het tekstje gevonden wordt en er is een vertaling dan wordt de vertaalde tekst geretourneerd. Als het tekstje niet gevonden wordt dan wordt er een leeg vertaalrecord voor de actieve taal ingevoegd zodat we een overzicht hebben van stringetjes die nog vertaald moeten worden. Voor het vertalen van strings is een interface op de vertaaltabel beschikbaar. Zo nu en dan gaat er eens iemand fijn nieuwe tekstjes vertalen. So far so good.
Probleem is nu dat voor elk woordje een query wordt gedaan. Een beetje page request levert dan 50-100 select statements op. De database staat op dezelfde server als de applicatie en op zich gaat dat best snel maar ideaal is het niet.
Ik heb voor de grap eens gekeken hoeveel het scheelt in de runtime van een page request als die translate functie geen lookup meer doet. Een page request kan dan tot 40% sneller worden.
Er zijn zo'n 700 tekstjes. Updates van de vertalingen moeten realtime verwerkt worden en beschikbaar zijn.
Dus ik wil die translate functie aanpakken.
Opties:
1. gettext. Ben ik huiverig voor omdat hier nogal wat dingen op de server moeten worden geregeld met locales enzo. Momenteel kan dat (de applicatie draait op een dedicated server) maar ik wil daar bij voorkeur niet afhankelijk van zijn.
2. cachen in sessies. een $_SESSION['translations'] array er op na houden. Het grote nadeel daarbij is dat als er een nieuwe vertaling beschikbaar is of een string is gewijzigd, dat niet in de sessie verwerkt kan worden. Bovendien worden die sessies dan erg groot qua file size en een sessie wordt geserialized op geslagen dus bij elk request moet het dan weer ontserialized worden. En gedurende de runtime van een script heb je dus een vertaaltabel in het geheugen staan.
3. Cachen in aparte vertaalbestanden. Deels dezelfde nadelen als bij 2. Maar er is iets als dbm dat zeer snel hashes op kan vragen. Dit vereist echter een hercompilatie van PHP, wat op zich geen probleem is, behalve dan dat ik nu gebruik maak van Debian en dus de security updates mee krijg. Dat is met een eigen php niet meer zo.
Wat is wijsheid?
Er is een functie translate( 'engels tekstje' ) die een select doet op een translate tabel. Als het tekstje gevonden wordt en er is een vertaling dan wordt de vertaalde tekst geretourneerd. Als het tekstje niet gevonden wordt dan wordt er een leeg vertaalrecord voor de actieve taal ingevoegd zodat we een overzicht hebben van stringetjes die nog vertaald moeten worden. Voor het vertalen van strings is een interface op de vertaaltabel beschikbaar. Zo nu en dan gaat er eens iemand fijn nieuwe tekstjes vertalen. So far so good.
Probleem is nu dat voor elk woordje een query wordt gedaan. Een beetje page request levert dan 50-100 select statements op. De database staat op dezelfde server als de applicatie en op zich gaat dat best snel maar ideaal is het niet.
Ik heb voor de grap eens gekeken hoeveel het scheelt in de runtime van een page request als die translate functie geen lookup meer doet. Een page request kan dan tot 40% sneller worden.
Er zijn zo'n 700 tekstjes. Updates van de vertalingen moeten realtime verwerkt worden en beschikbaar zijn.
Dus ik wil die translate functie aanpakken.
Opties:
1. gettext. Ben ik huiverig voor omdat hier nogal wat dingen op de server moeten worden geregeld met locales enzo. Momenteel kan dat (de applicatie draait op een dedicated server) maar ik wil daar bij voorkeur niet afhankelijk van zijn.
2. cachen in sessies. een $_SESSION['translations'] array er op na houden. Het grote nadeel daarbij is dat als er een nieuwe vertaling beschikbaar is of een string is gewijzigd, dat niet in de sessie verwerkt kan worden. Bovendien worden die sessies dan erg groot qua file size en een sessie wordt geserialized op geslagen dus bij elk request moet het dan weer ontserialized worden. En gedurende de runtime van een script heb je dus een vertaaltabel in het geheugen staan.
3. Cachen in aparte vertaalbestanden. Deels dezelfde nadelen als bij 2. Maar er is iets als dbm dat zeer snel hashes op kan vragen. Dit vereist echter een hercompilatie van PHP, wat op zich geen probleem is, behalve dan dat ik nu gebruik maak van Debian en dus de security updates mee krijg. Dat is met een eigen php niet meer zo.
Wat is wijsheid?