Schlagwort-Archiv: Codeschnippsel

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.