function binary_search($fp, $min, $max, $ip) {
if($min == $max)
return false;
$middle = floor(($min+$max) / 2);
fseek($fp, 21 * $middle);
$record = fscanf($fp, "%4x%4x\t%4x%4x\t%s\n");
$range_min = ($record[0] << 16) + $record[1];
$range_max = ($record[2] << 16) + $record[3];
$country = $record[4];
if($ip < $range_min)
return binary_search($fp, $min, $middle, $ip);
else if($range_max < $ip)
return binary_search($fp, $middle+1, $max, $ip);
return $country;
}
function find_ip($ip) {
if($fp = fopen(IP_DB_FILE, 'r')) {
$tmp = split('\.', $ip);
$ip = ($tmp[0] << 24) + ($tmp[1] << 16) + ($tmp[2] << 8) + ($tmp[3]);
$stat = fstat($fp);
$res = binary_search($fp, 0, $stat['size'] / 21, $ip);
fclose($fp);
}
else {
echo "Couldn’t open " . IP_DB_FILE;
}
return $res;
}