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;
}