domain = $domain; } /** * Fetch the servers with a DNS SRV request * * @return array */ public function getServers() { $result = []; foreach ( $this->getDnsRecords() 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; } $srvsByPrio = []; foreach ( $servers as $server ) { $srvsByPrio[$server['pri']][] = $server; } $min = min( array_keys( $srvsByPrio ) ); if ( count( $srvsByPrio[$min] ) == 1 ) { return $srvsByPrio[$min][0]; } else { // Choose randomly $rand = mt_rand( 0, count( $srvsByPrio[$min] ) - 1 ); return $srvsByPrio[$min][$rand]; } } /** * @param array $server * @param array $servers * @return array[] */ public function removeServer( $server, array $servers ) { foreach ( $servers as $i => $srv ) { if ( $srv['target'] === $server['target'] && $srv['port'] === $server['port'] ) { unset( $servers[$i] ); break; } } return array_values( $servers ); } /** * @return array[] */ protected function getDnsRecords() { return dns_get_record( $this->domain, DNS_SRV ); } }