Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:54504 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 18122 invoked from network); 11 Aug 2011 07:32:32 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 11 Aug 2011 07:32:32 -0000 Authentication-Results: pb1.pair.com smtp.mail=jehan.marmottard@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=jehan.marmottard@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 74.125.82.170 as permitted sender) X-PHP-List-Original-Sender: jehan.marmottard@gmail.com X-Host-Fingerprint: 74.125.82.170 mail-wy0-f170.google.com Received: from [74.125.82.170] ([74.125.82.170:40069] helo=mail-wy0-f170.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 62/F2-00852-F85834E4 for ; Thu, 11 Aug 2011 03:32:31 -0400 Received: by wyf23 with SMTP id 23so1369279wyf.29 for ; Thu, 11 Aug 2011 00:32:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; bh=sxWgXtlig61yVyYteHap/ImSRV4VGoKRiI+0JPuqJzk=; b=ZmnUuQmXn+WHuuquawKw10sggZuCnrUn5Bx/ijGLixzl0IR8phPn0jrnHuPZpPYRUF iOve5+xIL+XLN5Yp1zuU33lDdvky+ItpLyp0o8WyN2VokjNjInFemlNSOfSdITWuz+xg UPX/g0Va9DjWpaFwtVzAcH4sguWKsDa5tgSxA= Received: by 10.216.9.18 with SMTP id 18mr8280226wes.54.1313047947171; Thu, 11 Aug 2011 00:32:27 -0700 (PDT) MIME-Version: 1.0 Received: by 10.216.52.206 with HTTP; Thu, 11 Aug 2011 00:32:07 -0700 (PDT) Date: Thu, 11 Aug 2011 16:32:07 +0900 Message-ID: To: internals@lists.php.net Content-Type: multipart/mixed; boundary=0016364c7ea376d6cc04aa35ccee Subject: Proposition of a network function to sort DNS SRV records From: jehan.marmottard@gmail.com (=?UTF-8?B?SmVoYW4gUGFnw6hz?=) --0016364c7ea376d6cc04aa35ccee Content-Type: text/plain; charset=UTF-8 Hello, currently the built-in dns_get_record function has support for type SRV, which is very nice. Yet this supports only part of the DNS SRV RFC (RFC-2782). In particular, it will return records but won't sort them using the weight/priority algorithm. I won't detail the algorithm, but basically the lower priority records must be contacted first. And server with same priority must be contacted in a semi-random order using weight as a probability to be selected first (the larger weight, the larger chance). For instance, if I check Google's DNS records for their XMPP (IM) service: ------------------- $ ring _xmpp-client._tcp.gmail.com gmail.com. has a xmpp-client service record on tcp: priority = 20 weight = 0 port = 5222 target = talk3.l.google.com. gmail.com. has a xmpp-client service record on tcp: priority = 20 weight = 0 port = 5222 target = talk4.l.google.com. gmail.com. has a xmpp-client service record on tcp: priority = 5 weight = 0 port = 5222 target = talk.l.google.com. gmail.com. has a xmpp-client service record on tcp: priority = 20 weight = 0 port = 5222 target = talk1.l.google.com. gmail.com. has a xmpp-client service record on tcp: priority = 20 weight = 0 port = 5222 target = talk2.l.google.com. ------------------- We see here that one should always contact first talk.l.google.com and only if it fails, try the 4 remaining addresses (randomized with equal chances). That's like a basic/static load balancer. Anyway! So a return of dns_get_record would return the records in the order the DNS server responded (which is good and is what is asked: a bare DNS query function). I propose an additional function, called for instance dns_srv_sort which takes the return of dns_get_record, sort it and return sorted server/port data, ready to be connected to in this order. Example: $response = dns_get_record ('_xmpp-client._tcp.gmail.com', DNS_SRV); returns: Array ( [0] => Array ( [host] => _xmpp-client._tcp.gmail.com [type] => SRV [pri] => 20 [weight] => 0 [port] => 5222 [target] => talk1.l.google.com [class] => IN [ttl] => 9564 ) [1] => Array ( [host] => _xmpp-client._tcp.gmail.com [type] => SRV [pri] => 20 [weight] => 0 [port] => 5222 [target] => talk2.l.google.com [class] => IN [ttl] => 9564 ) [2] => Array ( [host] => _xmpp-client._tcp.gmail.com [type] => SRV [pri] => 20 [weight] => 0 [port] => 5222 [target] => talk3.l.google.com [class] => IN [ttl] => 9564 ) [3] => Array ( [host] => _xmpp-client._tcp.gmail.com [type] => SRV [pri] => 20 [weight] => 0 [port] => 5222 [target] => talk4.l.google.com [class] => IN [ttl] => 9564 ) [4] => Array ( [host] => _xmpp-client._tcp.gmail.com [type] => SRV [pri] => 5 [weight] => 0 [port] => 5222 [target] => talk.l.google.com [class] => IN [ttl] => 9564 ) ) $response = dns_srv_sort($response); returns: Array ( [0] => Array ( [port] => 5222 [server] => talk.l.google.com ) [1] => Array ( [port] => 5222 [server] => talk4.l.google.com ) [2] => Array ( [port] => 5222 [server] => talk3.l.google.com ) [3] => Array ( [port] => 5222 [server] => talk2.l.google.com ) [4] => Array ( [port] => 5222 [server] => talk2.l.google.com ) ) So this is a function I have used with success for quite some time. Feel free to check the sorting algorithm against RFC-2782. I think that's quite useful to have this function as a core function because right now, either PHP users will not sort SRV records as imposed by the RFC, or will each time rewrite the sorting function. Also I loaded the source repository and I see most functions are actually developed in C. Is it necessary to do so? If that's a prerequisite and you are actually interested in this function to be inserted as a core function, I will make the rewrite. And finally sorry by advance, I may not be aware of all the right procedure for proposing a patch (anyway that's not yet a patch, just a separate file), though the "Using SVN for PHP development" said to send patch to this ml. I hope that's fine. Thanks! Jehan --0016364c7ea376d6cc04aa35ccee Content-Type: application/x-httpd-php; name="dns_srv_sort.php" Content-Disposition: attachment; filename="dns_srv_sort.php" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gr7en1i60 PD9waHAKCi8qCiAqICRyZWNvcmRzIGlzIGFzIHJldHVybmVkIGJ5IGRuc19nZXRfcmVjb3JkLgog KiBUaGlzIGNhbGwgd2lsbCBleHRyYWN0IGFuZCBzb3J0IEROUyBTUlYgcmVjb3JkcyAgYXMgUkZD Mjc4MiBzcGVjaWZpaWVzLgogKiBBbnkgbm9uLVNSViByZWNvcmQgd2lsbCBiZSBkaXNjYXJkZWQg aW4gdGhlIHJlc3BvbnNlLgogKiBAcmV0dXJuIGFuIGFycmF5IHdoZXJlIGVhY2ggaXRlbSBpcyBp dHNlbGYgYW4gYXJyYXkgd2l0aCBhICdwb3J0JyBhbmQgYSAnc2VydmVyJwogKiBhbmQgd2hlcmUg dGhlIGluZGV4IG9yZGVyIG1hdHRlcnMgZm9yIGNvbm5lY3Rpb24gYXR0ZW1wdHMuCiAqLwpmdW5j dGlvbiBkbnNfc3J2X3NvcnQoJHJlY29yZHMpCnsKCSR0YXJnZXRzID0gYXJyYXkoKTsKCgkkcmVj cyA9IGFycmF5ICgpOwoJZm9yZWFjaCAoJHJlY29yZHMgYXMgJHJyKQoJewoJCWlmICgkcnJbJ3R5 cGUnXSA8PiAnU1JWJykKCQkJY29udGludWU7CgkJJHJlYyA9IGFycmF5ICgpOwoJCSRyZWNbJ3Rh cmdldCddID0gJHJyWyd0YXJnZXQnXTsKCQkkcmVjWydwb3J0J10gPSAkcnJbJ3BvcnQnXTsKCQkk cmVjWyd3ZWlnaHQnXSA9ICRyclsnd2VpZ2h0J107CgkJJHJlY3NbJHJyWydwcmknXV1bXSA9ICRy ZWM7Cgl9CgoJa3NvcnQgKCRyZWNzKTsKCWZvcmVhY2ggKCRyZWNzIGFzICRycnMpCgl7CgkJaWYg KGNvdW50ICgkcnJzKSA9PSAxKQoJCQkkdGFyZ2V0c1tdID0gYXJyYXkoCgkJCQkJJ3BvcnQnID0+ ICRycnNbMF1bJ3BvcnQnXSwKCQkJCQknc2VydmVyJyA9PiAkcnJzWzBdWyd0YXJnZXQnXSk7CgkJ ZWxzZQoJCXsKCQkJZnVuY3Rpb24gbnVsX2ZpcnN0KCRhLCAkYikKCQkJewoJCQkJaWYgKCRhWyd3 ZWlnaHQnXSA9PSAwICYmICRiWyd3ZWlnaHQnXSA9PSAwKQoJCQkJCXJldHVybiAwOwoJCQkJaWYg KCRhWyd3ZWlnaHQnXSA9PSAwKQoJCQkJCXJldHVybiAtMTsgLy8gbnVsIHdlaWdodGVkIHJlY29y ZHMgYXJlIGZpcnN0LgoJCQkJaWYgKCRiWyd3ZWlnaHQnXSA9PSAwKQoJCQkJCXJldHVybiAxOyAv LyBudWwgd2VpZ2h0ZWQgcmVjb3JkcyBhcmUgZmlyc3QuCgkJCQllbHNlCgkJCQkJcmV0dXJuIDA7 IC8vIG90aGVyIHRoYW4gdGhpcywgSSBkb24ndCBjYXJlLgoJCQl9CgoJCQl1c29ydCgkcnJzLCAn bnVsX2ZpcnN0Jyk7CgkJCSR3X3N1bSA9IDA7CgkJCXdoaWxlIChjb3VudCAoJHJycykgPiAwKQoJ CQl7CgkJCQlmb3JlYWNoICgkcnJzIGFzICYkcnIpCgkJCQl7CgkJCQkJJHdfc3VtICs9ICRyclsn d2VpZ2h0J107CgkJCQkJJHJyWyd3X3N1bSddID0gJHdfc3VtOwoJCQkJfQoJCQkJJHJhbmRfbnVt ID0gcmFuZCgwLCAkd19zdW0pOwoJCQkJZm9yZWFjaCAoJHJycyBhcyAkayA9PiAkcnIpCgkJCQl7 CgkJCQkJaWYgKCRyclsnd19zdW0nXSA+PSAkcmFuZF9udW0pCgkJCQkJewoJCQkJCQkkdGFyZ2V0 c1tdID0gYXJyYXkoCgkJCQkJCQkJJ3BvcnQnID0+ICRyclsncG9ydCddLAoJCQkJCQkJCSdzZXJ2 ZXInID0+ICRyclsndGFyZ2V0J10pOwoJCQkJCQl1bnNldCgkcnJzWyRrXSk7CgkJCQkJCWJyZWFr OwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gJHRhcmdldHM7Cn0KCi8qKiBURVNU OgokcmVzcG9uc2UgPSBkbnNfZ2V0X3JlY29yZCAoJ194bXBwLWNsaWVudC5fdGNwLmdtYWlsLmNv bScsIEROU19TUlYpOwpwcmludF9yKCRyZXNwb25zZSk7CmVjaG8gIjxici8+IjsKJHJlc3BvbnNl ID0gZG5zX3Nydl9zb3J0KCRyZXNwb25zZSk7CnByaW50X3IoJHJlc3BvbnNlKTsKICovCj8+Cg== --0016364c7ea376d6cc04aa35ccee--