异步DNS直接查询模块。

dev-master 2019-07-17 00:28 UTC

This package is auto-updated.

Last update: 2024-09-14 01:17:34 UTC


README

Build StatuscodecovCodacy BadgeMaintainability

此包正在开发中,异步部分尚未实现或添加。

此API旨在提供一个中间解决方案,提供直接到服务器的查询,能够详细处理响应,但仍然为程序员提供一个简单的接口。

使用指南

使用查询API

您可以从PHP(7版本或更高版本)中调用DNS查询API,它不需要特殊的原始套接字权限,因此应在大多数环境中正确运行。

要使用API,您必须创建一个查询对象(包含DNS服务器的主机名/IP和其他可选参数),执行查询(可以是完全查询,您指定结果类型,或智能A查找 <#SmartALookup>),并处理答案。

答案要么是错误的(请参阅下面的示例错误陷阱),要么是包含一个"count"属性(返回的记录数)和包含每个查询的答案的Result对象数组的Answer对象。

以下是一个执行A记录(IP地址)查找的示例脚本

// A simple DNS query example
require("vendor/autoload.php"); // Require API Source

use Async\Dns\Query;

// Your DNS Server
$dns_server = "ns.somehost.com"; 

// create Query object - there are other options we could pass here
$dns_query = new Query($dns_server);

// the question we will ask
$question = "www.somehost.com";

// the type of response(s) we want for this question
$type = "A";

// do the query
$result = $dns_query->query($question, $type); 

// Trap Errors
if ($dns_query->->hasError()) {
    // error occurred
    echo $dns_query->getLastError();
    exit();
}

//Process Results
$count = $result->count(); // number of results returned
foreach ($result as $result_count) {
    // only after A records
    if ($result_count->getTypeId() == "A") {
        echo $question." has IP address ".$result_count->getData()."<br>";
        echo $result_count->getString()."<br>";
    }
}

如果一切顺利,应该输出类似以下内容...

第一个输出来自我们的脚本编写问题和"数据"结果,第二个当我们输出答案的"字符串"属性时,它是特定记录的文本表示形式(如果已知类型)。

一个警告和为什么检查答案类型以上的说明

DNS不是一个完全直接的协议,表面上看似简单的东西,当你深入研究时可能并不简单(如果你已经了解DNS,请跳过)。

例如,对于特定DNS服务器上的主机的IP查找(A记录查找)可能不会只返回包含IP地址的单个答案记录。主机可能有多重指向,并返回多个记录,这些记录可能不是IP地址,而是CNAME别名。您查询的域名服务器可能不会为您进行递归或缓存查找,因此即使域名和主机存在,也可能返回没有答案。

因此,我们必须实际上处理结果(除非我们只是想查看查询提供的数据,而不对答案进行任何操作)。

只有CNAME别名的域名不会在答案部分解析为IP地址。如果我们请求www.somehost.com的A记录,我们可能只得到一个CNAME,即webhost.somehost.com。为了将其转换为IP地址,我们必须希望它已包含在附加答案部分(并检查 - 下面有详细说明)或对webhost.somehost.com执行另一个A记录查找。

如果您只需要一个主机的IP地址,则PHP内置的gethostbyname() https://php.ac.cn/ 或此API的SmartALookup() <#SmartALookup>可能是您想要的,而不是完整的查询。

答案和查询类型

API支持的记录(查询和结果)类型应该返回合理的数据是:A、NS、PTR、MX、CNAME、TXT和SOA。

请求不受支持的类型将导致查询失败。作为结果记录返回的不受支持的类型将具有null的"string"和"typeid"属性,但将在"data"中包含二进制数据,并在"type"中包含十进制记录类型。

回答结果

如果查询成功,它将返回一个包含计数属性 "count" 的 Answer 对象,指示返回的答案记录数量,以及包含这些记录的每个记录的 Result 对象数组。

Answer 对象分解如下:$answer->count 包含的答案记录数量 $answer->results[x]->typeid 文本记录类型 ID(A、MX、CNAME 等) $answer->results[x]->type 数字记录类型(十进制) $answer->results[x]->class 数字类别类型(十进制) $answer->results[x]->data 返回的数据(即 IP 地址或主机名) $answer->results[x]->domain 为 $answer->results[x]->domain 的域名数据 $answer->results[x]->string 答案的字符串表示(例如,www.fish.sea 有地址 x.y.z) $answer->results[x]->extras 特定类型的额外字段数组(例如,MX 交换的 "level") - 请见下文

特定类型的额外信息

某些结果类型具有扩展的额外信息,这些信息将以数组形式存在于 Result 对象的 "extras" 属性中。

MX 记录类型在 extas['level'] 中具有十进制邮件交换优先级

SOA 记录类型在 extras['responsible'] 中具有域的责任联系人,以及以下内容:extras['serial'] - 域序列号 extras['refresh'] - 域刷新 extras['retry'] - 域重试 extras['expiry'] - 域过期 extras['minttl'] - 域最小生存时间(TTL)

智能 A 查询

由于执行 A 查询并不总是返回 IP 地址,有时你只是想要一个 IP 地址(而不是潜在的一组 IP 地址和别名等),因此 Query 类提供了 SmartALookup() 方法。

此函数仅接受一个主机名,并返回一个 IP 地址或一个空字符串(如果查找失败,则可以检查 Query lasterror 属性以查看查询是否实际上失败或只是返回了无结果)。

如果结果数据包含 IP 地址,则将其返回(首选)。如果没有提供 IP 地址但提供了别名 CNAME,则将查找此别名(最多递归五个别名)。

实际上,这是一个特定于名称服务器的 gethostbyname() 版本,但在失败时返回一个空字符串而不是未经修改的 IP 地址。

更多信息

技术文档可在 此处 找到