jdwx/dns-query

原生PHP DNS解析器和更新库(PHP 8.1+)

v2.0.1 2024-04-16 21:09 UTC

README

本包的主要特性包括

  • 使用现代PHP命名空间、类和异常
  • 支持IPv4和IPv6,TCP和UDP套接字。
  • 包含用于处理动态更新的单独“更新器”类
  • 支持使用TSIG和SIG(0)对更新和区域传输进行区域签名
  • 支持使用PSR-6/PSR-16缓存实现来提高性能
  • 包含许多RR,包括DNSSEC RR。
  • 完全兼容PHP 8.1。

安装DNSQuery

您可以通过Composer直接要求它: https://packagist.org.cn/packages/jdwx/dns-query

composer require jdwx/dns-query

或从GitHub下载源码: https://github.com/jdwx/dns-query.git

要求

  • PHP 8.1+
  • PHP INI设置mbstring.func_overload等于0、1、4或5。

使用DNSQuery

DNSQuery根据需求提供多个接口。

最简单的接口旨在模仿PHP内置的dns_get_record()函数,并具有查询其他名称服务器的额外灵活性。

$out = Resolver::dns_get_record( 'google.com', DNS_MX );
var_dump( $out );
array(1) {
  [0] =>
  array(6) {
    'host' =>
    string(10) "google.com"
    'class' =>
    string(2) "IN"
    'ttl' =>
    int(300)
    'type' =>
    string(2) "MX"
    'pri' =>
    int(10)
    'target' =>
    string(15) "smtp.google.com"
  }
}

但它允许指定附加选项,例如用于查找的名称服务器

$out = Resolver::dns_get_record( 'google.com', DNS_MX, '1.1.1.1' );
var_dump( $out );

(产生与上面相同的输出。)

您还可以指定要用于查找的名称服务器列表或自定义resolv.conf文件。(见示例。)

对于重复查询,应实例化解析器。它还以该形式提供兼容性接口

$rsv = new Resolver();
$out = $rsv->compatQuery( 'google.com', DNS_MX );
var_dump( $out );

(产生与上面相同的输出。)

原生查询接口返回联系名称服务器的完整响应详情

$rsv = new Resolver();
$out = $rsv->query( 'google.com', 'MX' );
var_dump( $out );
class JDWX\DNSQuery\Packet\ResponsePacket#13 (12) {
  public string $rdata =>
  string(49) "(binary data)"
  public int $rdLength =>
  int(49)
  public int $offset =>
  int(49)
  public JDWX\DNSQuery\Packet\Header $header =>
  class JDWX\DNSQuery\Packet\Header#14 (15) {
    public int $id =>
    int(37144)
    public int $qr =>
    int(1)
    public int $opcode =>
    int(0)
    public int $aa =>
    int(0)
    public int $tc =>
    int(0)
    public int $rd =>
    int(1)
    public int $ra =>
    int(1)
    public int $zero =>
    int(0)
    public int $ad =>
    int(0)
    public int $cd =>
    int(0)
    public int $rCode =>
    int(0)
    public int $qdCount =>
    int(1)
    public int $anCount =>
    int(1)
    public int $nsCount =>
    int(0)
    public int $arCount =>
    int(0)
  }
  public array $question =>
  array(1) {
    [0] =>
    class JDWX\DNSQuery\Question#15 (3) {
      public string $qName =>
      string(10) "google.com"
      public string $qType =>
      string(2) "MX"
      public string $qClass =>
      string(2) "IN"
    }
  }
  public array $answer =>
  array(1) {
    [0] =>
    class JDWX\DNSQuery\RR\MX#16 (8) {
      public string $name =>
      string(10) "google.com"
      public string $type =>
      string(2) "MX"
      public string $class =>
      string(2) "IN"
      public int $ttl =>
      int(226)
      public int $rdLength =>
      int(9)
      public string $rdata =>
      string(9) "(binary data)"
      public int $preference =>
      int(10)
      public string $exchange =>
      string(15) "smtp.google.com"
    }
  }
  public array $authority =>
  array(0) {
  }
  public array $additional =>
  array(0) {
  }
  private array $compressed =>
  array(0) {
  }
  public string $answerFrom =>
  string(7) "1.1.1.1"
  public int $answerSocketType =>
  int(2)
  public float $responseTime =>
  double(0.0037810802459717)
}

文档

文档正在开发中 这里.

稳定性

本包的测试覆盖率开发不完整,目前仅限于Resolver功能。更新器和通知器尚未测试,并且并非所有RR都有测试覆盖率。

历史

此包是从Net_DNS2分叉的,Net_DNS2由Mike Pultz维护,直到2020年。主要区别是

  • 已移除PEAR支持。
  • 某些以前是可选的(例如,filter扩展)现在需要。
  • 用流畅设置器替换了难以验证的数组样式选项配置。
  • 更改了缓存实现
  • 使用PSR-4命名空间和兼容的自动加载。
  • 通过我的组织的内部代码质量标准。
  • 对网络代码进行大量重构以提高未来的灵活性(例如,DNS over HTTPS)。
  • 额外的单元测试。

我道歉,向后兼容性不是优先事项;我的公司要求遵守某些编码标准以支持这项工作。因此,这可能仅适用于新开发。

原始包代表了多年来完成的大量工作。因此,Mike Pultz应得到本包大部分工作的全部信用;我所做的大部分工作是锦上添花,并将其适应我的特定需求。但由于这是一个公共仓库,我想明确表示,我并不声称对Mike的原始工作拥有信用。

有关Net_DNS2的更多信息,请参阅 Net_DNS2 网站