添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最基本的用法是通过解析器工厂创建解析器。你只需要给它一个 nameserver ,然后你就可以开始解析了。

$loop = React\EventLoop\Factory::create();
$config = React\Dns\Config\Config::loadSystemConfigBlocking();
$server = $config->nameservers ? reset($config->nameservers) : '8.8.8.8';
$factory = new React\Dns\Resolver\Factory();
$dns = $factory->create($server, $loop);
$dns->resolve('igor.io')->then(function ($ip) {
    echo "Host: $ip\n";
$loop->run();

请参阅示例

Config类可用于加载系统默认配置。这是一个可以访问文件系统和块的操作。 理想情况下,这个方法应该在循环开始前只执行一次,而不是在循环运行时重复执行。 请注意,如果无法加载系统配置,则此类可能会返回一个empty配置。 因此,如果找不到默认nameserver,您可能希望像上面那样应用默认nameserver

请注意,工厂在创建解析器实例时会从文件系统加载hosts文件一次。 理想情况下,这个方法应该在循环开始前只执行一次,而不是在循环运行时重复执行。

Caching

通过将解析程序配置为使用CachedExecutor来缓存结果:

$loop = React\EventLoop\Factory::create();
$config = React\Dns\Config\Config::loadSystemConfigBlocking();
$server = $config->nameservers ? reset($config->nameservers) : '8.8.8.8';
$factory = new React\Dns\Resolver\Factory();
$dns = $factory->createCached($server, $loop);
$dns->resolve('igor.io')->then(function ($ip) {
    echo "Host: $ip\n";
$dns->resolve('igor.io')->then(function ($ip) {
    echo "Host: $ip\n";
$loop->run();

如果第一个调用在第二个调用之前返回,则将仅执行一个查询。 第二个结果将从内存中的缓存中提供。 这对于需要多次查找相同主机名的长时间运行的脚本特别有用。

请参阅示例3.

Custom cache adapter

默认情况下,上述操作将使用内存缓存。

你也可以指定一个自定义缓存实现CacheInterface来缓存:

$cache = new React\Cache\ArrayCache();
$loop = React\EventLoop\Factory::create();
$factory = new React\Dns\Resolver\Factory();
$dns = $factory->createCached('8.8.8.8', $loop, $cache);

另请参阅wiki了解更多其他缓存实现 cache实现.

ResolverInterface

resolve()

resolve(string $domain): PromiseInterface<string,Exception> 方法可以用于将$domain解析为单个IPv4地址(键入A查询)。

$resolver->resolve('reactphp.org')->then(function ($ip) {
    echo 'IP for reactphp.org is ' . $ip . PHP_EOL;

向DNS服务器发送$domain的DNS查询,成功后返回单个IP地址。

如果DNS服务器为该查询发送一个包含多个IP地址的DNS响应消息,它将从响应中随机选择一个IP地址。 如果你想要完整的IP地址列表或者想要发送不同类型的查询,你可使用resolveAll() 方法。

如果DNS服务器发送指示错误代码的DNS响应消息,则此方法将拒绝并返回RecordNotFoundException。 它的消息和代码可用于检查响应代码。

如果DNS通信失败,并且服务器没有以有效的响应消息进行响应,则该消息将以Exception拒绝。

可以通过取消其待处理的承诺来取消待处理的DNS查询,如下所示:

$promise = $resolver->resolve('reactphp.org');
$promise->cancel();

resolveAll()

resolveAll(string $host, int $type): PromiseInterface<array,Exception>方法可用于解析$domain的所有记录值并查询$type。

$resolver->resolveAll('reactphp.org', Message::TYPE_A)->then(function ($ips) {
    echo 'IPv4 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL;
$resolver->resolveAll('reactphp.org', Message::TYPE_AAAA)->then(function ($ips) {
    echo 'IPv6 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL;

这是此程序包中的主要方法之一。它会将$domain的DNS查询发送到您的DNS服务器, 并在成功后返回一个包含所有记录值的列表。

如果DNS服务器发送的DNS响应消息包含此查询的一个或多个记录,它将返回一个列表,其中包含响应中的所有记录值。 您可以使用Message :: TYPE_ *常量来控制将发送哪种查询类型。 请注意,此方法始终返回记录值列表,但是每种记录值类型取决于查询类型。 例如,它返回用于A型查询的IPv4地址,用于AAAA型查询的IPv6地址,用于NS型,CNAME和PTR型查询的主机名以及用于其他查询的结构化数据。 有关更多详细信息,请参见Record文档。

如果DNS服务器发送指示错误代码的DNS响应消息,则此方法将拒绝并返回RecordNotFoundException。它的消息和代码可用于检查响应代码。

如果DNS通信失败,并且服务器没有以有效的响应消息进行响应,则该消息将以Exception拒绝。

可以通过取消其待处理的承诺来取消待处理的DNS查询,如下所示:

$promise = $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA);
$promise->cancel();

UdpTransportExecutor

UdpTransportExecutor可用于通过UDP传输发送DNS查询。

这是发送一个DNS查询到您的DNS服务器的主类,由Resolver内部用于实际的消息传输。

对于更高级的用法,可以直接使用这个类。

下面的示例查找igor.ioIPv6地址。

$loop = Factory::create();
$executor = new UdpTransportExecutor('8.8.8.8:53', $loop);
$executor->query(
    new Query($name, Message::TYPE_AAAA, Message::CLASS_IN)
)->then(function (Message $message) {
    foreach ($message->answers as $answer) {
        echo 'IPv6: ' . $answer->data . PHP_EOL;
}, 'printf');
$loop->run();

请参阅 示例4.

请注意,此执行器未实现超时机制,您可能希望与TimeoutExecutor结合使用,如下所示:

$executor = new TimeoutExecutor(
    new UdpTransportExecutor($nameserver, $loop),
    3.0,
    $loop

另请注意,此执行器使用不可靠的UDP传输,并且它不实现任何重试逻辑,因此您可能希望与RetryExecutor结合使用,如下所示:

$executor = new RetryExecutor(
    new TimeoutExecutor(
        new UdpTransportExecutor($nameserver, $loop),
        3.0,
        $loop

注意,这个执行器是完全异步的,因此允许并发执行任意数量的查询。 您应该限制应用程序中并发查询的数量,否则很可能会在解析器端面临速率限制和禁令。 对于许多常见的应用程序,当第一个查询仍然挂起时,你可能想要避免多次发送相同的查询, 所以你可能想要结合使用CoopExecutor:

$executor = new CoopExecutor(
    new RetryExecutor(
        new TimeoutExecutor(
            new UdpTransportExecutor($nameserver, $loop),
            3.0,
            $loop

此类仅出于组织原因而使用PHP的UDP套接字,并且没有利用 react/datagram 的优势,以避免两个包之间的循环依赖。 高级组件应该利用数据报组件,而不是从头重新实现这个套接字逻辑。

TcpTransportExecutor

TcpTransportExecutor类可用于通过TCP / IP流传输发送DNS查询。

这是将DNS查询发送到DNS服务器的主要类之一。

对于更高级的用法,可以直接使用此类。 以下示例查询reactphp.orgIPv6地址。

$loop = Factory::create();
$executor = new TcpTransportExecutor('8.8.8.8:53', $loop);
$executor->query(
    new Query($name, Message::TYPE_AAAA, Message::CLASS_IN)
)->then(function (Message $message) {
    foreach ($message->answers as $answer) {
        echo 'IPv6: ' . $answer->data . PHP_EOL;
}, 'printf');
$loop->run();

请参阅示例#92

请注意,此执行器未实现超时机制,您可能希望与TimeoutExecutor结合使用,如下所示:

$executor = new TimeoutExecutor(
    new TcpTransportExecutor($nameserver, $loop),
    3.0,
    $loop

UdpTransportExecutor不同,该类使用可靠的TCP/IP传输,因此不必实现任何重试逻辑。 注意,这个执行器是完全异步的,因此允许并发执行查询。第一个查询将建立到DNS服务器的TCP/IP套接字连接,该连接将在短时间内保持打开状态。

其他查询将自动重用到DNS服务器的这个现有套接字连接,将在这个连接上管道多个请求,并将在短时间内保持空闲连接打开。 如果您只是偶尔发送查询,初始TCP/IP连接开销可能会导致轻微的延迟 - 当在现有连接上发送大量并发查询时, 它会变得越来越高效,并避免创建许多并发套接字(如基于udp的executor)。 您可能仍然希望限制应用程序中的(并发)查询数量,或者您可能面临解析器端的速率限制和禁令。 对于许多常见的应用程序,当第一个查询仍然挂起时,你可能想要避免多次发送相同的查询,所以你可能想要结合使用CoopExecutor:

$executor = new CoopExecutor(
    new TimeoutExecutor(
        new TcpTransportExecutor($nameserver, $loop),
        3.0,
        $loop

这个类使用PHP的TCP/IP套接字,并且没有利用 react/socket 的优势,以避免两个包之间的循环依赖。高级组件应该利用套接字组件,而不是从头重新实现这个套接字逻辑。

SelectiveTransportExecutor

SelectiveTransportExecutor类可用于通过UDP或TCP/IP流传输发送DNS查询。 此类将自动选择正确的传输协议向DNS服务器发送DNS查询。它总是首先尝试通过更有效的UDP传输发送它。 如果此查询产生与大小相关的问题(截断消息),则它将通过TCP/IP传输重试。

对于更高级的用法,可以直接使用此类。 以下示例查询reactphp.orgIPv6地址。

$executor = new SelectiveTransportExecutor($udpExecutor, $tcpExecutor);
$executor->query(
    new Query($name, Message::TYPE_AAAA, Message::CLASS_IN)
)->then(function (Message $message) {
    foreach ($message->answers as $answer) {
        echo 'IPv6: ' . $answer->data . PHP_EOL;
}, 'printf');

注意,这个执行器仅实现为DNS查询选择正确传输的逻辑。 实现正确的传输逻辑、实现超时和任何重试逻辑都由executor决定, 更多细节请参见 UdpTransportExecutorTcpTransportExecutor

注意,这个执行器是完全异步的,因此允许并发执行任意数量的查询。 您应该限制应用程序中并发查询的数量,否则很可能会在解析器端面临速率限制和禁令。 对于许多常见的应用程序,当第一个查询仍然挂起时,你可能想要避免多次发送相同的查询, 所以你可能想要像这样结合使用CoopExecutor:

$executor = new CoopExecutor(
    new SelectiveTransportExecutor(
        $datagramExecutor,
        $streamExecutor

HostsFileExecutor

注意,上面的UdpTransportExecutor类总是执行一个实际的DNS查询。 如果你还想从你的hosts文件中获取条目,你可以使用以下代码:

$hosts = \React\Dns\Config\HostsFile::loadFromPathBlocking();
$executor = new UdpTransportExecutor('8.8.8.8:53', $loop);
$executor = new HostsFileExecutor($hosts, $executor);
$executor->query(
    new Query('localhost', Message::TYPE_A, Message::CLASS_IN)

推荐的安装这个库的方法是通过ComposerComposer 新手?

该项目遵循SemVer , 默认安装最新支持的版本:

$ composer require react/dns:^1.4

有关版本升级的详细信息,请参见CHANGELOG

该项目旨在在任何平台上运行,因此不需要任何PHP扩展,并支持通过 PHP 7+HHVM在旧版PHP 5.3上运行。

强烈推荐在这个项目中使用PHP 7+

要运行测试套件,首先需要克隆这个存储库,然后安装所有依赖项通过Composer:

$ composer install

要运行测试套件,请转到项目根目录并运行:

$ php vendor/bin/phpunit

该测试套件还包含许多依赖稳定internet连接的功能集成测试。 如果您不想运行这些,则可以像这样跳过它们:

$ php vendor/bin/phpunit --exclude-group internet

License

MIT, see LICENSE file.

  • RFC 1034 域名-概念和设施
  • RFC 1035 域名-实现和规范
  •