diff --git a/src/SrvDiscoverer.php b/src/SrvDiscoverer.php new file mode 100644 index 0000000..098ce9e --- /dev/null +++ b/src/SrvDiscoverer.php @@ -0,0 +1,71 @@ +domain = $domain; + } + + /** + * Fetch the servers with a DNS SRV request + * + * @return array + */ + public function getServers() + { + $records = dns_get_record($this->domain, DNS_SRV); + $result = []; + foreach ($records as $record) { + $result[] = [ + 'target' => $record['target'], + 'port' => $record['port'], + 'pri' => $record['pri'], + 'weight' => $record['weight'], + ]; + } + + return $result; + } + + /** + * Pick a server according to the priority fields. + * Note that weight is currently ignored. + * + * @param array $servers from getServers + * @return array|bool + */ + public function pickServer(array $servers) + { + if (!$servers) { + return false; + } + $by_prio = []; + foreach ($servers as $server) { + $by_prio[$server['pri']][] = $server; + } + + $min = min(array_keys($by_prio)); + if (count($by_prio[$min]) == 1) { + return $by_prio[$min][0]; + } else { + // Choose randomly + $rand = mt_rand(0, count($by_prio[$min])-1); + return $by_prio[$min][$rand]; + } + } +}