amphp/dns

Amp. 异步DNS解析

维护者

详细信息

github.com/amphp/dns

主页

源代码

问题

资助包维护!
amphp

安装数: 10,085,992

依赖: 19

建议者: 0

安全: 0

星标: 156

关注者: 12

分支: 32

开放问题: 4

v2.2.0 2024-06-02 19:54 UTC

README

AMPHP 是一组针对 PHP 设计的事件驱动库,考虑到纤维和并发性。 amphp/dns 提供主机名到 IP 地址的解析和查询特定 DNS 记录。

Latest Release MIT License

安装

此包可以作为 Composer 依赖项安装。

composer require amphp/dns

使用方法

配置

amphp/dns 会自动检测系统配置并使用它。在类 Unix 系统中,它读取 /etc/resolv.conf 并尊重名称服务器、超时和尝试的设置。在 Windows 中,它会查找 Windows 注册表中的正确条目并使用列出的名称服务器。您可以将自定义的 ConfigLoader 实例传递给 Rfc1035StubResolver 以加载另一个配置,例如静态配置。

它在 Unix 和 Windows 系统上尊重系统主机文件,因此可以在像 Docker 这样的具有命名容器的环境中正常工作。

该包使用全局默认解析器,可以通过 Amp\Dns\resolver() 访问和更改。如果提供了除 null 以外的参数,则解析器用作全局实例。

通常不需要更改解析器。如果您想为某个特定的请求使用自定义配置,可以创建一个新的解析器实例并使用它而不是更改全局实例。

主机名到 IP 解析

Amp\Dns\resolve 提供主机名到 IP 地址的解析。默认情况下,它返回一个包含 IPv4 和 IPv6 地址的数组。可以通过传递第二个参数并指定相应的类型来限制返回的 IP 地址类型。

// Example without type restriction. Will return IPv4 and / or IPv6 addresses.
// What's returned depends on what's available for the given hostname.

/** @var Amp\Dns\DnsRecord[] $records */
$records = Amp\Dns\resolve("github.com");
// Example with type restriction. Will throw an exception if there are no A records.

/** @var Amp\Dns\DnsRecord[] $records */
$records = Amp\Dns\resolve("github.com", Amp\Dns\DnsRecord::A);

自定义查询

Amp\Dns\query 支持其他各种 DNS 记录类型,如 MXPTRTXT。它自动重写传递给 PTR 查询的 IP 地址。

/** @var Amp\Dns\DnsRecord[] $records */
$records = Amp\Dns\query("google.com", Amp\Dns\DnsRecord::MX);
/** @var Amp\Dns\DnsRecord[] $records */
$records = Amp\Dns\query("8.8.8.8", Amp\Dns\DnsRecord::PTR);

缓存

默认情况下,Rfc1035StubResolver 使用 Amp\Cache\LocalCache 缓存响应。您可以通过创建自定义的 Rfc1035StubResolver 实例并将其通过 Amp\Dns\resolver() 设置来设置任何其他 Amp\Cache\Cache 实现,但通常是不必要的。如果您有很多非常短运行的脚本,您可能需要考虑使用带有缓存的本地 DNS 解析器而不是设置自定义缓存实现,例如 dnsmasq

重新加载配置

Rfc1035StubResolver(该包默认提供的解析器)默认情况下会缓存 /etc/resolv.conf / Windows 注册表中的配置以及读取的主机文件。如果您希望重新加载它们,可以设置一个周期性定时器,请求后台重新加载配置。

EventLoop::repeat(600, function () use ($resolver) {
    Amp\Dns\dnsResolver()->reloadConfig();
});

注意 上述代码依赖于解析器没有被更改。 reloadConfigRfc1035StubResolver 的特定功能,而不是 Resolver 接口的一部分。

示例

<?php

require __DIR__ . '/examples/_bootstrap.php';

$githubIpv4 = Amp\Dns\resolve("github.com", Dns\Record::A);
pretty_print_records("github.com", $githubIpv4);

$firstGoogleResult = Amp\Future\awaitFirst([
  Amp\async(fn() => Amp\Dns\resolve("google.com", Dns\Record::A)),
  Amp\async(fn() => Amp\Dns\resolve("google.com", Dns\Record::AAAA)),
]);

pretty_print_records("google.com", $firstGoogleResult);

$combinedGoogleResult = Amp\Dns\resolve("google.com");
pretty_print_records("google.com", $combinedGoogleResult);

$googleMx = Amp\Dns\query("google.com", Amp\Dns\DnsRecord::MX);
pretty_print_records("google.com", $googleMx);