- Increased performance; most requests are 2-10x faster than Net_DNS
- Near drop-in replacement for Net_DNS
- Uses modern PHP classes and exceptions
- Support for IPv4 and IPv6, TCP and UDP sockets.
- Includes a separate, more intuitive “Updater” class for handling dynamic update
- Support zone signing using TSIG and SIG(0) for updates and zone transfers
- Includes a local cache using shared memory or flat file to improve performance
- includes many more RR’s, including DNSSEC RR’s.
Install using Composer:
composer require pear/net_dns2
Or install using PEAR:
pear install Net_DNS2
Or grab a copy from GitHub: https://github.com/mikepultz/netdns2
- PHP 5.4+
- The PHP INI setting
mbstring.func_overloadequals 0, 1, 4, or 5.
- Resource Records Supported
- Local Cache
- Request Signing – SIG(0) and TSIG
- Full IPv6 Support
- added the AMTRELAY resource record type (RFC 8777).
- added Net_DNS2_RR::asArray(), which returns the same values as __toString(), but as an array for easier access.
- added Net_DNS2::closeSockets(), which lets you close all cached network sockets in the resolver object.
- added Net_DNS2::getSockets(), which returns the local sockets cache array.
- added date_created and date_last_used to the Net_DNS2_Socket object, to track usage stats on each socket object.
- added the SHA256, SHA384, and GOST digest defines to Lookups.php.
- dropped the Net_DNS2_Socket_Sockets, and switch to just using the streams code. There’s no speed difference anymore.
- fixed a bug in Net_DNS2_Packet::compress() and Net_DNS2_Packet::expand() related to dot literals in compressed names.
- fixed a display issue in the IPSECKEY RR when displaying hostname / domain names in the gateway field.
- fixed a couple inconsistencies in the docs.
- fixed a PHP 7.4 bug in Sockets.php; accessing a null value as an array throws an exception now.
- fixed Net_DNS2_RR_DS so it will be able to support other digest definitions without any other changes.
- the Net_DNS2_RR_NIMLOC class was incorrectly named Net_DNS2_RR_NIMLOCK.
- Net_DNS2_PrivateKey was using the wrong member variable name for the key_format value.
- changed all references to array() to .
- removed all sorts of license noise from the files.
- updated the test cases to use PHPUnit v9+.
- Bugfix when returning an empty bitmap-type in BitMap.php – patch from BugMaster510945.
- Added the BIND 9 private record RR (TYPE65534) – patch from BugMaster510945.
- Added DNSSEC algorithms 13-16 (ECDSAP256SHA256, ECDSAP384SHA384, ED25519, and ED448).
- Added SSHFP algoritm ED25519.
- Modified Net_DNS2::sendPacket() to use current()/next() rather than the deprecated each() (deprecated in 7.2).
- fixed an issue when looking up . or com., when using the strict_query_mode flag.
- fixed a bug in the caching logic where I was loading the content more than once per instance, when really I only need to do it once.
- changed the Net_DNS2::sock array to use the SOCK_DGRAM and SOCK_STREAM defines, rather than the strings ‘tcp’ or ‘udp’.
- fixed a bug in the Net_DNS2_Header and Net_DNS2_Question classes, where I was using the wrong bit-shift operators when parsing some of the values. This only became apparent when somebody was trying to use the CAA class (id 257); it was causing this to roll over to the next 8 bit value, and returning 1 (RR A) instead of the CAA class.
- fixed a bug that occurs when a DNS lookup request times out, and then the same class is reused for a subsequent request. Because I’m caching the sockets, the timed out data could eventually come in, and end up being seen as the result for a subsequent lookup.
- fixed a couple cases in NSAP.php where I was comparing a string to an integer.
- changed the role for the README.md file to doc.
- parse the resolv.conf options line; right now I just support the timeout and rotate options.
- the options values only work if you set the new option use_resolv_options to true; this is to keep backwards compatibility.
- added support for RFC 6594; support for SHA-256 and ECDSA in the SSHFP resource record.
- added the SMIMEA resource record; this just extends the TLSA record.
- added the AVC resource records; this just extends the TXT record.
- added error and EDNS0 defines for DNS Cookies (RFC7873).
- added EDNS0 defines to the lookup class.
- dropped the Net_DNS2_Packet::formatIPv6() function; this was deprecated in v1.1.3.
- re-wrote the Net_DNS2::expandIPv6() function. Based on testing, the new version is about twice as fast.
- increased the default DNSSEC payload size value to 4000 bytes per RFC 4035 section 4.1; this is still configurable.
- fixed a bug where I was still using the DNS_MAX_UDP_SIZE default (512 bytes) for all requests, event DNSSEC, where I should have been using the dnssec_payload_size config value.
- removed the limitation that PTR records had to look like IP addresses; you can add other things to PTR records, like service discovery objects- RFC 6763.
- dropped support for using the Sockets library on Windows. There have been too many inconsistencies between versions of Windows; we’ll just default to use the Streams library.
- fixed the Net_DNS2_RR_PTR class so we can pass ptrdname’s with spaces in them so that we can support DNS-Based Service Discovery (RFC 6763).
- added support for the CSYNC resource record – see RFC 7477.
- added request signing support using RSA 256 and 512 (requires PHP 5.4.8 or up)
- changed the Net_DNS2::nameservers value (the list of name server) to public so they can be accessed directly if needed.
- added support for the CDNSKEY and OPENPGPKEY RR types
- completely re-wrote the sendPacket() function; the old process would throw an exception when the first error was encountered, which meant it never checked the next DNS server. The new code will cycle to the next name server if the request fails, and at the same time keep track of the exception generated by each name server separately.
- added a new E_NS_SOCKET_FAILED error code.
- fixed a bug in the Net_DNS2_Exception class; the ‘previous’ argument was only added in PHP 5.3.0
- fixed Net_DNS2_Packet_Request::set so we can pass ‘.’ in as name value for querying the root name severs
- fixed Net_DNS2::setServers() so it overrides any existing values, rather than just adding to them. Also made it remove any duplicate name server entries.
- added the query response_time to the Net_DNS2_Packet_Response object.
- added support for the EUI48 and EUI64 resource records (RFC7043)
- fixed how we handle the return values from socket select() statements; this wasn’t causing a problem, but it wasn’t quite right
- added some error messaging when the socket times out
- before we cache the data, unset the rdata value; this was causing some JSON errors to be generated, and we don’t need the data anyway.
- added the Net_DNS2_Packet_Request? and Net_DNS2_Packet_Response? objects to the Net_DNS2_Exception object
- added support in the TSIG class for SHA algorithms (requires the hash extension, which is included in PHP >= 5.1.2), patch provided by Manuel Mausz
- added support for the NID, L32, L64, and LP DNS RR’s (RFC6742)
- lots of phpcs cleanup
- re-worked a lot of the code around OPT RR’s, including adding support for the DO flag
- added the AD and CD flags to the Net_DNS2_Header class for DNSSEC
- added a new function to keep track of RR’s that should NOT be cached.
- added a new flag (dnssec) to request DNSSEC lookups; this adds an OPT RR to the additional section
- added a new flag (dnssec_payload_size) to adjust the EDNS(0) UDP payload size.
- added a new flag (dnssec_cd_flag) to set the DNSSEC CD bit to disable signature validation.
- added a new flag (dnssec_ad_flag) to set the DNSSEC AD bit to request authentic data without needing to set the DO flag.
- fixed an issue in Net_DNS2_Socket_Sockets?; Windows (specifically < 2003) has problems with MSG_WAITALL
- changed Net_DNS2_RR::construct() to use get_class() instead of get_called_class()
- added a DNSSEC test to the testing suite.
- changed the socket_connect() code to start off non-blocking, and call select() after connect() so a timeout on a invalid server works properly
- added the new TLSA RR – RFC 6698
- fixed the socket defines again; apparently the values of the SOCK are different under solaris
- changed the Net_DNS2_Updater::update() so you can pass a reference to a variable that will be populated with the response object
- moved the lines that add the response server/type to after the is_null() check- it should have been there to begin with.
- fixed a whole bunch of cases where I wasn’t incrementing the offset values properly
- added support to set the RD (recursion desired) bit when making a request
- added the name server that the response came from to the Net_DNS2_Packet_Response? object.
- added the socket type (TCP or UDP) that was used for the request.
- changed the internal socket logic to use a local define for SOCK_STREAM and SOCK_DGRAM rather than the one provided with the sockets library; this isn’t available if you’re not using the library.
- fixed a bug when an AXFR fails; rather than returning right away, it was waiting until there was a timeout condition. Now it returns right away on failure.
- added a LICENSE file to satisfy fedora packaging guidelines.
- included the tests folder in the PEAR package.
- updated the tests to not include a specific include_path, and to use the Google public DNS servers for the resolution tests, rather than the /etc/resolv.conf file (which won’t exist on a Windows system)
- fixed a endless loop bug in the Streams.php file; this was related to the code changes I made + UDP packets.
- added some trimming of whitespace to Net_DNS2_RR::buildString(); we’d get some uninitialized string offset errors if there was some blank space at the end.
- fixed a few cases where Net_DNS2_Lookup where it should Net_DNS2_Lookups.
- added support for a strict query mode, that lets you handle the weird way DNS handles failed lookups + CNAME records; see RFC 1034 section 3.6.2 for more information.
- fixed some warning messages that were coming from the cache classes when a json_decode() would fail.
- fixed a bug in Net_DNS2_Cache_File? and Net_DNS2_Cache_Shm?; it would try to write the file even if caching was turned off
- made sure we don’t cache records when we do a zone transfer.
- added some blocking in both the Sockets.php and Streams.php file around the read function.
- I wasn’t handling multi-message zone transfers properly; now we loop through and read all the messages and pack them together as one big result
- changed the Net_DNS2_Sockets::sock property from private to protected; this was causing some problems when the request was failing.
- PHP doesn’t support unsigned integers, but many of the RR’s return unsigned values (like SOA), so there is the possibility that the value will overrun on 32bit systems, and you’ll end up with a negative value. So a new function was added to convert the negative value to a string with the correct unsigned value.
This version changes the way some exceptions are thrown, and may break your code!
- added numeric error codes to the Lookups class, and had each method that throws an exception throw a numeric error code along with the message.
- dropped all references to InvalidArgumentException?– we only use the Net_DNS2_Exception from now on.
- added the CAA, URI, TALINK, CDS and TA resource records. Some of these are experimental, but are pretty straight forward.
- fixed a bug in formatString(); my version was only putting double quotes around strings that have spaces, but apparently ALL strings should have double quotes around them. This is how BIND does it.
- re-organized the Net_DNS2_Lookups initialization code; it no longer creates a global object of itself.
- fixed a bug in the caching code; in some cases it wouldn’t cache the same content more then once.
- added an option to use JSON to serialize the cache data rather than using the PHP serialize function. JSON is much faster, but loses the class definition, and becomes a stdClass object.
- fixed a handful of cases where I was using double quotes (“) where a single quote (‘) would be fine.
- fixed a math issue with the name compress logic; this would somtimes screw up Updates with multiple RR’s
- added a new test in the test suite, that validates that the domain name compression and expansion works properly
- added support for IPv6 DNS servers; from resolv.conf files, and from name server arrays
- added new IPv4 and IPv6 validation functions, and a IPv6 expand function
- changed the A, AAAA and IPSECKEY RR's to use the new validation methods
- added support for IPv6 PTR records
- dropped the old IPv4 regex from the lookups class
- fixed a bug in the Net_DNS2_Updater class; I wasn’t resetting the internal packet request values, so in some cases making more than one request on the same instance would fail.
- Fixed a bug in Net_DNS2; I wasn’t handling comments properly when parsing the resolv.conf file.
- check for duplicate entries when adding/deleting entries in the Updater() class; BIND will throw and error if you try to delete the same RR twice in the same request, not sure if this is expected behaviour
- modified several RR’s to clean up the trailing period when it’s displayed on hosts.
- fixed a bug in the autoload function; if you had another autoload function defined, and tried to load a class with an underscore in the name, it would fail.
- added support for signing requests using SIG(0); uses the PHP openssl extension, and only currently supports RSA- DSA support in PHP is limited.
- moved the signing code for SIG(0) and TSIG to the base class so it can be used for both updates and queries (for AXFR)
- added a simple local cache feature using shared memory (shmop extension) or using a flat fille. This feature is disabled by default.
- added support for the ATMA resource record (supported in Windows)