====== PHP RFC: Implement socket_getaddrinfo() ======
* Version: 0.1
* Date: 2016-08-08
* Author: David Walker (dave@mudsite.com)
* Status: Implemented (PHP 7.2)
* First Published at: http://wiki.php.net/rfc/socket_getaddrinfo
===== Introduction =====
This RFC targets a reported feature request in [[https://bugs.php.net/bug.php?id=72733|#72733]]. The request is that PHP expose the C level function getaddrinfo(). This is a missing nice piece to the current socket library. When dealing with variable networks it would be beneficial to allow libc to tell us what methods of connecting/listening would be most appropriate given a set of hints.
===== Proposal =====
The implementation[[https://wiki.php.net/rfc/socket_getaddrinfo#references|[1]]] I'm proposing implements 4 new functions. ''socket_addrinfo_lookup()'' will return an array of resources, with each resource corresponding to each returned addrinfo. The next two implemented methods ''socket_addrinfo_bind()'', and ''socket_addrinfo_connect()'', would be used to bind, or connect, to a given resource rather than make the user go through the process of creating the socket and connect/binding themselves. The last, ``socket_addrinfo_explain`` is to convert the resource to an array for examination.
socket_addrinfo_lookup(string node[, mixed service, array hints]) : array
socket_addrinfo_connect(resource $addrinfo) : resource
socket_addrinfo_bind(resource $addrinfo) : resource
socket_addrinfo_explain(resource $addrinfo) : array
IPv4 Example
AF_INET, 'ai_socktype' => SOCK_STREAM));
$sockaddr = reset($addrinfo);
if (!$sockaddr) die ("No Valid Socket Types");
$sock = socket_addrinfo_bind($sockaddr);
// ^^ $sock is a socket resource that is bound to 127.0.0.1:2000 using TCP/IP ready for reading
var_dump(socket_addrinfo_explain($sockaddr));
/* Outputs:
array(5) {
["ai_flags"]=>
int(0)
["ai_family"]=>
int(2)
["ai_socktype"]=>
int(1)
["ai_protocol"]=>
int(6)
["ai_addr"]=>
array(2) {
["sin_port"]=>
int(2000)
["sin_addr"]=>
string(9) "127.0.0.1"
}
}
*/
IPv6 Example
AF_INET6, 'ai_socktype' => SOCK_STREAM));
$sockaddr = reset($addrinfo);
if (!$sockaddr) die ("No Valid Socket Types");
$sock = socket_addrinfo_bind($sockaddr);
// ^^ $sock is a socket resource that is bound to [::1]:2000 using TCP/IP ready for reading
var_dump(socket_addrinfo_explain($sockaddr));
/* Outputs:
array(5) {
["ai_flags"]=>
int(0)
["ai_family"]=>
int(10)
["ai_socktype"]=>
int(1)
["ai_protocol"]=>
int(6)
["ai_addr"]=>
array(2) {
["sin6_port"]=>
int(2000)
["sin6_addr"]=>
string(3) "::1"
}
}
*/
===== Backward Incompatible Changes =====
New functionality; no BC issues.
===== Proposed PHP Version(s) =====
Next PHP 7.x (currently 7.2)
===== RFC Impact =====
==== To SAPIs ====
None
==== To Existing Extensions ====
Socket acquired new functionality
==== To Opcache ====
None
==== New Constants ====
Exposing the AI_* family of constants.
===== Proposed Voting Choices =====
Vote to implement the new functionality, would require a 2/3 majority.
* Yes
* No
Vote Start: 2016-08-24 15:23 UTC
Vote End: 2016-08-31 23:59 UTC
===== Implementation =====
- merged into master (i.e. pre 7.2)
- https://github.com/php/php-src/commit/d59af68f
- https://github.com/php/php-src/commit/750f3d3f
- a link to the PHP manual entry for the feature
===== References =====
* [1] - [[https://github.com/php/php-src/pull/2078|Proposed Implementation]]