语法: int checkdnsrr(string host, string [type]);
返回值: 整数
函数种类: 网络系统
PHP下的checkdnsrr函数 -- 可以根据所给定的host name(域名)或者IP地址检查它是否有DNS各项记录(包括A记录、MX记录、NS记录、CNAME、PTR记录、AAAA记录、SRV记录、TXT记录、SOA记录等等),本函数用来检查 DNS 的字段纪录。指定的参数 host 可以是网络位址 (IP Address),也可以用机器名称 (Domain Name)。参数 type 可以省略,内定值为 MX。而参数 type 的值可为以下的其中之一:A、MX、NS、SOA、PTR、CNAME 或 ANY。若找到了指定网址的 DNS 字段,返回 true;若未找到指定的 DNS 字段或是有错误均会返回 false。这里不是返回实际的DNS记录值而是返回一个是否存在的状态。如果需要返回实际值需要用到dns_get_record()
主要可以用来检测一个输入的域名的真实性,以及用于网站验证用户输入的邮箱是否真实存在(有没有MX记录),当然也可以开发成查询平台,供用户查询各个域名的各项DNS记录情况;
用法:
checkdnsrr ( string $host [, string $type = "MX" ] )
第一个参数是域名或者ip
第二个参数是解析类型,分别有:
A (Address) 记录 指定主机名(或域名)对应的IP地址记录。
MX 记录 指定邮件交换记录(默认)
NS 记录 指定域名服务器的记录,指定该域名由哪个DNS来进行解析。
SOA记录 一般在辅助的dns服务器里才用到,用来指定谁是主服务器。
PTR记录 从ip指向域名的反向解析记录
CNAME记录 别名记录
AAAA记录 是一个指向IPv6的记录
A6记录 同上
SRV记录 它是DNS服务器的数据库中支持的一种资源记录的类型,一般是为Microsoft的活动目录设置时的应用。
TXT记录 文本信息
ANY记录 任何记录,所有数据类型
应用案例一、php验证用户输入的邮箱有效性和正确性,用checkdnsrr验证email的域名部分的有效性(Linux下可用):
function validate_email($email){
$exp="^[a-z'0-9]+([._-][a-z'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
if(eregi($exp,$email)){ //先用正则表达式验证email格式的有效性
if(checkdnsrr(array_pop(explode("@",$email)),"MX")){//再用checkdnsrr验证email的域名部分的有效性
return true;
}else{
return false;
}
}else{
return false;
}
}
目前PHP5.3版之前的自带checkdnsrr函数只在linux平台有效。window平台下不能使用,幸好有人研究了以下方法可以使用。
另外写了个函数代替checkdnsrr函数在window平台环境使用,用if判断,如果存在checkdnsrr函数就使用,如果不存在就使用nslookup。
if (!function_exists('checkdnsrr ')) {
function checkdnsrr($host, $type) {
if(!empty($host) && !empty($type)) {
@exec('nslookup -type=' . escapeshellarg($type) . ' ' . escapeshellarg($host), $output);
foreach ($output as $k => $line) {
if(eregi('^' . $host, $line)) {
return true;
}
}
}
return false;
}
}
应用上面的方法,写了一个案例
案例二
if(!function_exists('checkdnsrr')){
function checkdnsrr($host, $type=''){
if(!empty($host)){
$type = (empty($type)) ? 'MX' : $type;
exec('nslookup -type='.$type.' '.escapeshellcmd($host), $result);
$it = new ArrayIterator($result);
foreach(new RegexIterator($it, '~^'.$host.'~', RegexIterator::GET_MATCH) as $result){
if($result){
return true;
}
}
}
return false;
}
}
案例三:这是一个可以实际应用的案例,放到PHP文件中执行就能出结果
以下给出一个查询的实例:
<?php // A IPV4地址记录。负责进行主机名-IPv4地址转换 // AAAA IPV6地址记录 //A6 用于表示IPV6地址的记录类型 //ANY 查找任意类型的记录 //CNAME 规范名记录。将别名映射到真正的域名 //MX 邮件交换记录。为主机确定邮件服务器的名和相关首选项。这是默认设置 //NAPTR 命名授权指针。由于支持与DNS不兼容的名,使用正则表达式重写规则将其解析为新的域 //NS 命名服务器记录。确定主机的命名服务器 //PTR 指针服务器 用于将IP地址映射到主机 //SOA 授权启动记录,为主机设置全局参数 // SRV 服务记录,用于为给定域指示各种服务的位置。 $record = checkdnsrr("www.bnxb.com","ANY"); if($record) echo "the domain name has been reserved. SOrry"; else echo "the domain name is available"; echo " "; //使用这个函数验证给定邮件地址的域是否存在 $email = "web@bnxb.com"; $domain = explode("@",$email); $valid = checkdnsrr($domain[1],"ANY"); // ANY 查找任意类型的记录 if($valid) echo "the domain existts"; else echo "cannot locate MX record for $domain[1]"; echo " "; //dns_get_record() 包含与hostname指定域有关的各种DNS资源记录 //了解example.com域的更多信息 $result = dns_get_record("bnxb.com"); print_r($result); // 获取MX 记录 getmxrr()函数获取hostname所制定主机的MX记录 echo " "; getmxrr("bnxb.com",$mxhosts); print_r($mxhosts); ?>