|
分享一个php操作dns的类,可用于dns的查询、dns解析等操作,有需要的朋友参考下。
php实现的dns解析类,如下:
magento(麦进斗)
下载
Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的
<?php /* -----------
PHPresolver - PHP DNS resolver library
Version 1.1
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation; either version 2.1 of the License, or any
later version.
This library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not,
write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
----------------------------------------------
*/
define( "DNS_RECORDTYPE_A", 1 );
define( "DNS_RECORDTYPE_NS", 2 );
define( "DNS_RECORDTYPE_CNAME", 5 );
define( "DNS_RECORDTYPE_SOA", 6 );
define( "DNS_RECORDTYPE_PTR", 12 );
define( "DNS_RECORDTYPE_MX", 15 );
define( "DNS_RECORDTYPE_AAAA", 28 );
define( "DNS_RECORDTYPE_ANY", 255 );
define( "DNS_RECORDTYPE_TXT", 16 );
/*
list of record types not yet implemented
define( "DNS_RECORDTYPE_A6", 38 );
define( "DNS_RECORDTYPE_NULL", 10 );
define( "DNS_RECORDTYPE_OPT", 41 );
define( "DNS_RECORDTYPE_TKEY", 249 );
define( "DNS_RECORDTYPE_TSIG", 250 );
define( "DNS_RECORDTYPE_IXFR", 251 );
define( "DNS_RECORDTYPE_AXFR", 252 );
define( "DNS_RECORDTYPE_MAILB", 253 );
define( "DNS_RECORDTYPE_MAILA", 254 );
define( "DNS_RECORDTYPE_MD", 3 );
define( "DNS_RECORDTYPE_MF", 4 );
define( "DNS_RECORDTYPE_MB", 7 );
define( "DNS_RECORDTYPE_MG", 8 );
define( "DNS_RECORDTYPE_MR", 9 );
define( "DNS_RECORDTYPE_WKS", 11 );
define( "DNS_RECORDTYPE_HINFO", 13 );
define( "DNS_RECORDTYPE_MINFO", 14 );
define( "DNS_RECORDTYPE_RP", 17 );
define( "DNS_RECORDTYPE_AFSDB", 18 );
define( "DNS_RECORDTYPE_X25", 19 );
define( "DNS_RECORDTYPE_ISDN", 20 );
define( "DNS_RECORDTYPE_RT", 21 );
define( "DNS_RECORDTYPE_NSAP", 22 );
define( "DNS_RECORDTYPE_NSAP_PTR", 23 );
define( "DNS_RECORDTYPE_SIG", 24 );
define( "DNS_RECORDTYPE_KEY", 25 );
define( "DNS_RECORDTYPE_PX", 26 );
define( "DNS_RECORDTYPE_GPOS", 27 );
define( "DNS_RECORDTYPE_LOC", 29 );
define( "DNS_RECORDTYPE_NXT", 30 );
define( "DNS_RECORDTYPE_EID", 31 );
define( "DNS_RECORDTYPE_NIMLOC", 32 );
define( "DNS_RECORDTYPE_SRV", 33 );
define( "DNS_RECORDTYPE_ATMA", 34 );
define( "DNS_RECORDTYPE_NAPTR", 35 );
define( "DNS_RECORDTYPE_KX", 36 );
define( "DNS_RECORDTYPE_CERT", 37 );
*/
define( "DNS_OPCODE_QUERY" , 0x0000 );
define( "DNS_OPCODE_IQUERY", 0x0800 );
define( "DNS_OPCODE_STATUS", 0x1000 );
define( "DNS_OPCODE_NOTIFY", 0x1800 );
define( "DNS_OPCODE_UPDATE", 0x2000 );
define( "DNS_RCODE_SUCCESSFUL" , 0x0001 );
define( "DNS_RCODE_MALFORMATED" , 0x0002 );
define( "DNS_RCODE_FAILEDSERVER" , 0x0003 );
define( "DNS_RCODE_NAMEERROR" , 0x0004 );
define( "DNS_RCODE_UNIMPLEMENTED", 0x0005 );
define( "DNS_RCODE_REFUSED" , 0x0006 );
define( "DNS_HEADERSPEC_IS_RESPONSE" , 0x8000 );
define( "DNS_HEADERSPEC_OPCODE_MASK" , 0x7800 );
define( "DNS_HEADERSPEC_AUTHORITIVE_ANSWER" , 0x0400 );
define( "DNS_HEADERSPEC_TRUNCATED" , 0x0200 );
define( "DNS_HEADERSPEC_RECURSION_DESIRED" , 0x0100 );
define( "DNS_HEADERSPEC_RECURSION_AVAILABLE" , 0x0080 );
define( "DNS_HEADERSPEC_RESPONSE_SPEC_MASK" , 0x0480 );
define( "DNS_HEADERSPEC_QUERY_SPEC_MASK" , 0x0300 );
define( "DNS_HEADERSPEC_RESERVED" , 0x0e00 );
define( "DNS_HEADERSPEC_RESULT_CODE_MASK" , 0x000f );
define( "DNS_CLASS_INTERNET" , 0x0001 );
define( "DNS_UDP_PACKET_MAX_LENGTH", 512 );
class DNSRecord
{
var $type;
var $name;
var $dclass;
var $ttl;
var $specific_fields;
function DNSRecord(
$name,
$type,
$dclass = DNS_CLASS_INTERNET,
$ttl = 0,
$specific_fields = false ) {
$this->name = $name;
$this->type = $type;
$this->dclass = $dclass;
$this->ttl = $ttl;
$this->specific_fields = $specific_fields;
}
function &getTypeSpecificField( $name ) {
if( $this->specific_fields ) {
return $this->specific_fields[$name];
}
return false;
}
}
class DNSResolver
{
var $port;
var $nameserver;
var $timeout;
function DNSResolver( $nameserver, $port = 53, $timeout = 1000000 ) {
$this->port = $port;
$this->nameserver = $nameserver;
$this->timeout = $timeout;
}
function sendQuery( $dnsquery, $useTCP = false ) {
$answer = false;
$out_buf = $dnsquery->asOctets( false );
$out_buf_len = strlen( $out_buf );
if( $out_buf ) {
if( $useTCP == false && $out_buf_len nameserver, $this->port, $this->timeout ) ) === false ) {
return false;
}
socket_set_blocking( $sock, true );
if( fwrite( $sock, $out_buf ) == $out_buf_len ) {
$answer = new DNSAnswer( $sock, DNS_UDP_PACKET_MAX_LENGTH );
}
fclose( $sock );
} else {
/* connection by TCP */
if( ( $sock = fsockopen( $this->nameserver, $this->port, $this->timeout ) ) === false ) {
return false;
}
socket_set_blocking( $sock, true );
if( fwrite( $sock, pack( 'n', $out_buf_len ) ) == 2 &&
fwrite( $sock, $out_buf ) == $out_buf_len ) {
$tmp = unpack( 'nl', fread( $sock, 2 ) );
$limit_length = $tmp['l'];
print $limit_length;
$answer = new DNSAnswer( $sock, $limit_length );
}
fclose( $sock );
}
}
return $answer;
}
}
class DNSQuery
{
var $id; // 1 - 65535
var $header_opcode;
var $query_record;
var $flags;
function DNSQuery( &$dnsrecord, $flags = DNS_HEADERSPEC_RECURSION_DESIRED )
{
$this->id = rand( 1, 255 ) | ( rand( 0, 255 ) flags = $flags & DNS_HEADERSPEC_QUERY_SPEC_MASK;
$this->header_opcode = DNS_OPCODE_QUERY;
$this->query_record = &$dnsrecord;
}
function asOctets() {
if( $this->query_record->name === false ) { return false; }
$buf = '';
$buf .= pack( "nnnnnn", $this->id, DNS_OPCODE_QUERY | $this->flags, 1, 0, 0, 0 );
$buf .= $this->query_record->name->asOctets();
$buf .= pack( "nn", $this->query_record->type, $this->query_record->dclass );
return $buf;
}
}
class DNSMessageParser
{
var $stream;
var $nbytes_read;
var $octets;
var $limit;
function DNSMessageParser( $stream, $limit ) {
$this->stream = $stream;
$this->nbytes_read = 0;
$this->octets = '';
$this->limit = $limit;
}
function readStreamDirectly( $nbytes ) {
if( ( $this->limit -= $nbytes ) stream, $nbytes );
$this->octets .= $buf;
$this->nbytes_read += $nbytes;
return $buf;
}
function readBufferedStream( $nbytes, $offset ) {
if( $offset nbytes_read ) {
$diff = $this->nbytes_read - $offset;
if( $nbytes octets, $offset, $nbytes );
} else {
$buf = substr( $this->octets, $offset, $diff );
$nbytes -= $diff;
}
} else {
$buf = '';
while( $offset > $this->nbytes_read ) {
if( $this->readStreamDirectly( $offset - $this->nbytes_read ) === false ) {
return false;
}
}
}
if( ( $_buf = $this->readStreamDirectly( $nbytes ) ) === false ) {
return false;
}
$buf .= $_buf;
return $buf;
}
function getHeaderInfo() {
if( ( $buf = $this->readStreamDirectly( 12 ) ) === false ) {
$this = false;
return;
}
return unpack( "nid/nspec/nqdcount/nancount/nnscount/narcount", $buf );
}
function getQueryRecords( $nrecs ) {
$recs = array();
while( --$nrecs >= 0 ) {
if( ( $labels = $this->getLabels() ) === false ) {
$this = false;
return;
}
if( ( $buf = $this->readStreamDirectly( 4 ) ) === false ) {
$this = false;
return;
}
$info = unpack( "ntype/ndclass", $buf );
$recs[] = new DNSRecord(
new DNSName( $labels ),
$info['type'],
$info['dclass']
);
}
return $recs;
}
function getResourceRecords( $nrecs ) {
$recs = array();
while( --$nrecs >= 0 ) {
if( ( $labels = $this->getLabels() ) === false ) {
return false;
}
if( ( $buf = $this->readStreamDirectly( 10 ) ) === false ) {
return false;
}
$info = unpack( "ntype/ndclass/Nttl/nrdlength", $buf );
switch( $info['type'] ) {
case DNS_RECORDTYPE_CNAME:
case DNS_RECORDTYPE_NS:
case DNS_RECORDTYPE_PTR:
if( ($_labels = $this->getLabels($info['rdlength']) ) === false ) {
return false;
}
$specific_fields = array( 'dname' => new DNSName( $_labels ) );
break;
case DNS_RECORDTYPE_TXT:
if( ($_labels = $this->getLabels($info['rdlength']) ) === false ) {
return false;
}
$specific_fields = array( 'text' => $_labels );
break;
case DNS_RECORDTYPE_MX:
if( ( $buf = $this->readStreamDirectly(2) ) === false ) {
return false;
}
$specific_fields = unpack( 'npreference', $buf );
if( ( $_labels = $this->getLabels($info['rdlength']-2) ) === false ) {
return false;
}
$specific_fields['exchange'] = new DNSName( $_labels );
break;
case DNS_RECORDTYPE_A:
if( ( $buf = $this->readStreamDirectly(4) ) === false ) {
return false;
}
$specific_fields = array( 'address' => DNSName::newFromString( implode( '.', unpack( 'Ca/Cb/Cc/Cd', $buf ) ) ) );
break;
case DNS_RECORDTYPE_AAAA:
if( ( $buf = $this->readStreamDirectly(16) ) === false ) {
return false;
}
$specific_fields = array( 'address' => DNSName::newFromString( implode( '.', unpack(
'Ca/Cb/Cc/Cd/Ce/Cf/Cg/Ch/Ci/Cj/Ck/Cl/Cm/Cn/Co/Cp', $buf ) ).'.IP6.ARPA' ) );
break;
case DNS_RECORDTYPE_SOA:
$specific_fields = array();
if( ($_labels = $this->getLabels($info['rdlength']) ) === false ) {
return false;
}
$specific_fields['source'] = new DNSName( $_labels );
if( ($_labels = $this->getLabels($info['rdlength']) ) === false ) {
return false;
}
$specific_fields['resp_person'] = array_shift( $_labels ).'@';
$specific_fields['resp_person'] .= implode( '.', $_labels );
if( ( $buf = $this->readStreamDirectly(20) ) === false ) {
return false;
}
$specific_fields = array_merge(
$specific_fields,
unpack( 'Nserial/Nrefresh/Nretry/Nexpire/Nminttl', $buf )
);
break;
default:
if( $this->readStreamDirectly( $info['rdlength'] ) === false ) {
return false;
}
$specific_fields = false;
}
$recs[] = new DNSRecord(
new DNSName( $labels ),
$info['type'],
$info['dclass'],
$info['ttl'],
$specific_fields
);
}
return $recs;
}
function getLabels( $max_length = 255, $offset = -1 ) {
if( $offset nbytes_read; }
$labels = array();
for(;;) {
if( --$max_length readBufferedStream( 1, $offset ) ) === false ) {
return false;
}
$label_len = ord( $buf );
++$offset;
if( $label_len readBufferedStream( $label_len, $offset ) ) === false ) {
return false;
}
$offset += $label_len;
if( $label_len == 0 ) { break; }
} else {
/* compressed */
if( ( $buf = $this->readBufferedStream( 1, $offset ) ) === false ) {
return false;
}
if( --$max_length getLabels( $offset - $_offset, $_offset )) === false ) {
return false;
}
$labels = array_merge( $labels, $_labels );
break;
}
}
return $labels;
}
}
class DNSAnswer
{
var $id;
var $result_code;
var $flags;
var $rec_query;
var $rec_answer;
var $rec_authority;
var $rec_additional;
function DNSAnswer( &$stream, $limit ) {
$msgparser = new DNSMessageParser( $stream, $limit );
$info = & $msgparser->getHeaderInfo();
$this->id = $info['id'];
$this->result_code = $info['spec'] & DNS_HEADERSPEC_RESULT_CODE_MASK;
$this->flags = $info['spec'] & DNS_HEADERSPEC_RESPONSE_SPEC_MASK;
$nrec_query = $info['qdcount'];
$nrec_answer = $info['ancount'];
$nrec_authority = $info['nscount'];
$nrec_additional = $info['arcount'];
if( ( $this->rec_query = &$msgparser->getQueryRecords( $nrec_query ) ) === false ) {
$this = false;
return;
}
if( ( $this->rec_answer = &$msgparser->getResourceRecords( $nrec_answer ) ) === false ) {
$this = false;
return;
}
if( ( $this->rec_authority = &$msgparser->getResourceRecords( $nrec_authority ) ) === false ) {
$this = false;
return;
}
if( ( $this->rec_additional = &$msgparser->getResourceRecords( $nrec_additional ) ) === false ) {
$this = false;
return;
}
}
}
class DNSName
{
var $labels;
function DNSName( $labels ) {
$this->labels = & $labels;
}
function isRealDomainName() {
$i = count( $this->labels ) - 1;
if( $i >= 1 && strtoupper($this->labels[$i-1]) == 'ARPA' ) {
return false;
}
return true;
}
function newFromString( $domain_name ) {
if( strpos( $domain_name, ':' ) !== false && !ereg( '[^0-9a-fA-f:.]', $domain_name ) ) {
/* IPv6 address literal expression spec */
$labels = array();
$components = explode( ':', $domain_name );
$ncomponents = count($components);
$offset = $ncomponents;
while( --$offset >= 0 ) {
$subcomps = explode( '.', $components[$offset] );
$nsubcomps = count( $subcomps );
if( $nsubcomps == 1 ) {
if( $subcomps[0] == '' ) {
$_offset = 0;
while( $components[$_offset] != '' ) {
++$_offset;
}
$count = 9-($ncomponents-$offset)+$_offset;
while( --$count >= 0 ) {
$labels[] = '0';
$labels[] = '0';
$labels[] = '0';
$labels[] = '0';
}
if( $_offset >= 4;
$labels[] = dechex( $compval & 0x0f );
$compval >>= 4;
$labels[] = dechex( $compval & 0x0f );
$compval >>= 4;
$labels[] = dechex( $compval & 0x0f );
$compval >>= 4;
}
} elseif( $nsubcomps == 4 ) {
$labels[] = dechex( $subcomps[3] );
$labels[] = dechex( $subcomps[2] );
$labels[] = dechex( $subcomps[1] );
$labels[] = dechex( $subcomps[0] );
} else {
return false;
}
}
$labels[] = 'IP6';
$labels[] = 'ARPA';
$labels[] = '';
} else {
if( substr( $domain_name, -1, 1 ) != '.' ) {
$domain_name .= '.';
}
$labels = explode( '.', $domain_name );
$nlabels = count( $labels );
if( $nlabels == 5 && !ereg( '[^0-9.]', $domain_name ) ) {
/* IPv4 raw address literal representation spec */
$tmp = (string)$labels[0];
$labels[0] = (string)$labels[3];
$labels[3] = $tmp;
$tmp = (string)$labels[1];
$labels[1] = (string)$labels[2];
$labels[2] = $tmp;
$labels[4] = 'IN-ADDR';
$labels[5] = 'ARPA';
$labels[6] = '';
}
}
return new DNSName( $labels );
}
function asOctets() {
$upto = count( $this->labels );
$buf = '';
for( $offset = 0; $offset labels[$offset] );
$buf .= pack( "C", $label_len ).$this->labels[$offset];
}
return $buf;
}
function getCanonicalName() {
return implode( ".", $this->labels );
}
}
?> |
0
0
相关文章
如何通过 AJAX 向 PHP 批量上传多个 Base64 图片数据
PHP时区设置导致定时任务出错_计划任务时区调整方法【详解】
PHP解密必须用命令行吗_PHP解密命令行与图形界面操作【说明】
怎样读取CSV文件到数组_PHP读取CSV文件转换为数组方法【操作】
DW怎样检查PHP语法_快速语法检查的方法【指南】
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。
616
2026.02.13
本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。
194
2026.02.13
本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。
91
2026.02.13
本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。
20
2026.02.13
本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。
54
2026.02.13
本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。
15
2026.02.12
本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。
598
2026.02.12
本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。
56
2026.02.12
热门下载
相关下载
精品课程
共12课时 | 0.6万人学习
共37课时 | 1.8万人学习
共6课时 | 0.5万人学习
最新文章



