Automatische Spracherkennung in PHP

Da ich es bisher schon ein paar Projekten benötigt habe, möchte ich hier ein kleines Script zur Ermittlung der vom Benutzer (bzw. Browser) gewünschten Sprache veröffentlichen. Es geht dabei nicht darum anhand der Benutzereingaben oder der geografischen Herkunft des Benutzers die Sprache zu ermitteln, sondern nur anhand der übermittelten Browserdaten. Natürlich hat dieses Verfahren den Nachteil, dass wenn keine vernünftige Anforderung durch den Browser erfolgt, eine Standardsprache verwendet werden muss. Andererseits wird dem Benutzer auch nicht auf Grund der Herkunft seiner IP-Adresse, die nicht mit seiner tatsächlichen Herkunft übereinstimmen muss, eine x-beliebige Sprachversion der Website vorgesetzt wird. Der Code bedarf denke ich über die schon vorhandenen Kommentare hinaus keiner weiteren Erläuterung.

// set $requested_language = "" for security reasons (activated register globals or what ever else)
$requested_language = "";
// first step: check if this is allready done
if (!isset($_SESSION["language"]))
{
	// second step - check if something usefull had been committed
	if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]) && $_SERVER["HTTP_ACCEPT_LANGUAGE"] != "")
	{
		// get the iso-code for the requested language - mostly these are the first alphabethical and decimal signs)
		$requested_language = preg_split("/[\W]+/",$_SERVER["HTTP_ACCEPT_LANGUAGE"], 2);
		$requested_language[0] = strtolower($requested_language[0]);
	}
	// set the language, if the first signs are alphabetical or decimal and if there is a language-file in the given folder
	if (preg_match('/^[\w]{2,3}$/', $requested_language[0]) && is_file(BACKEND_PATH."config/languages/".$requested_language[0].".php")) 
	{
		$_SESSION["language"] = $requested_language[0];
	}
	// otherwise set the DEFAULT_LANGUAGE - you will have to set this somewhere else (e.g.: define("DEFAULT_LANGUAGE", "de"))
	else 
	{
		$_SESSION["language"] = DEFAULT_LANGUAGE;
	}
}
// include the language-file - in this case the containing array $langVar have all the language-vars
require_once (CONFIG_PATH."languages/".$_SESSION["language"].".php");

Loadbalancing für MySQL (-Slaves)

Dieser Artikel im Blog eines Kollegen hat mich dazu veranlasst mir den verwendeten Algorithmus mal ein wenig näher anzusehen und zu überarbeiten – und ihn zumindest in Sachen Speicherbedarf zu verbessern. Heraus gekommen ist folgendes:

function getSlave($cluster)
{
        // gibt es nur einen Server im Array, wird dieser zurückgeliefert
        if(count($databaseClusters[$cluster]) == 1) {
                return "master";
        }
        else {
                $sum = 0;
                foreach($databaseClusters[$cluster] as $slave) {
                        $sum += $slave["prio"];
                }
                $randomVal = rand(0, $sum);
                if($randomVal < $sum / 2) {
                        $i = 0;
                        $tmpSum = 0;
                        while($tmpSum < $randomVal) {
                                  $tmpSum += $databaseClusters[$cluster]["slave$i"]["prio"];
                                  $i++;
                        }
                }
                else {
                        $i = count($databaseClusters[$cluster]);
                        $tmpSum = $sum;
                        while($tmpSum < $randomVal) {
                                $tmpSum -= $databaseClusters[$cluster]["slave$i"]["prio"];
                                $i--;
                        }
                }
 
                return "slave$i";
        }
}

Herausgekommen ist dadurch zwar eine längere aber im Allgemeinen speicherschonendere Methode um Datenbankqueries zu verteilen. Um weitere Informationen zu erhalten lest bitte bei meinem Kollegen weiter.

SVN mit JavaHL unter Windows

Im Rahmen einiger privater, als auch in Projekten für meinen Arbeitgeber setze ich in eclipse Subclipse für die Versionsverwaltung ein. Bisher war das an meinem Windows-PC nur in Verbindung mit dem (viel zu langsamen) SVNKIT möglich. Um das schnellere JavaHL einzusetzen muss man leider ein klein wenig „tricksen“. Hier nun eine kurze Anleitung wie es dennoch möglich ist:

1. Installation von subclipse wie auf subclipse.tigris.org beschrieben

2. Herunterladen und installieren von tortoisesvn (zu finden hier: tortoisesvn.net)

3. Nach dem Systemneustart (tortoisesvn erfordert diesen leider scheinbar) die Datei [Laufwerk]:\Dokumente und Einstellungen\[Aktueller Benutzername]\Anwendungsdaten\Subversion\config bearbeiten (Achtung: die doppelten Backslashes sind wichtig!):

3.1 nach „[tunnels]“ suchen
3.2 darunter einfügen (Mit public/private-key): ssh = [Laufwerk]:\\Programme\\TortoiseSVN\\bin\\TortoisePlink.exe -i "[Laufwerk]:\\[Pfad zum Keyfile]"
—-> sollte kein Key verfügbar sein, einfach den Parameter „-i“ mit allem was danach kommt weg lassen
3.3 speichern und schließen 😉

4. In eclipse in „Window“ -> „Preferences“ -> „Team“ -> „SVN“ unter „SVN Interface“ JavaHL auswählen und darunter („Configuration Location“) „Use Directory“ auswählen. Dort dann den Pfad zur Subversion-Config eintragen (s. Punkt 2), abschließend auf „Apply“ und/oder „Ok“ klicken und fertig. Ab jetzt könnt ihr JavaHL verwenden.

Hinweise zur Erstellung des Key-Files:
Hierfür bietet sich insbesondere das Tool „PUTTYgen“ das beim Putty dabei ist an – hat man bereits einen unter Linux erstellten Public/Private-Key kann man den hier in das unter Windows benötigte Format umwandeln. Putty gibt es unter anderem hier: PUTTY-Download

Diese Beschreibung sollte so auf allen eclipse-Plattformen (wie zum Beispiel auch Aptana Studio) ab eclipse-Version 3.2 funktionieren – wahrscheinlich auch schon früher.