Většina MySQL serverů ve Facebooku je replikovaná do několika geograficky vzdálených lokací. Když se s nimi bavíte z webového serveru, tak obvykle chcete ten nejbližší. Pro jeho přesné nalezení by bylo potřeba mít detailní znalost o topologii sítě, pro hrubý odhad se ale stačí podívat na IP adresu. Servery ve stejném racku budou ve stejném rozsahu. Ve stejném datacentru bude stejný rozsah o něco větší. Takže stačí nalézt nejbližší IP adresu.
Pro to nemůžeme použít běžný matematický rozdíl, protože k 192.168.0.255 je blíž 192.168.0.1 než 192.168.1.1, i když po převodu na celé číslo funkcí ip2long je rozdíl větší. Potřebujeme najít nejvyšší rozdílný bit.
<?php /** Nalezení bitově nejbližší IP adresy * @param string * @param array neprázdné pole IP adres předaných jako řetězce * @return string * @copyright Jakub Vrána, https://php.vrana.cz/ */ function find_closest_ip($my_ip, $ips) { $my_ip = ip2long($my_ip); $distances = array(); foreach ($ips as $ip) { $distances[$ip] = ceil(log(($my_ip ^ ip2long($ip)) + 1, 2)); } return array_search(min($distances), $distances); } ?>
Vlastní IP adresa se dá na webu zjistit z $_SERVER['SERVER_ADDR']
, ve skriptu pomocí gethostbyname(php_uname('n'))
. A celé to možná závisí na tom, že je webový server za proxy serverem, takže jeho IP adresa je z vnitřní sítě, nikoliv z venkovní.
Na závěr uvedu, že tenhle jednoduchý výpočet používám jen u jedné malé aplikace a to ještě jen ve vývojovém režimu, protože to bylo snadnější než integrovat abstrakci, která vrací nejbližší server přesně.
Diskuse je zrušena z důvodu spamu.