PHP原生fsockopen实现Whois域名查询
利用PHP内置的网络函数fsockopen可以方便地查询域名的注册信息。本文详解了如何通过域名后缀(TLD)匹配对应的WHOIS服务器地址,建立TCP连接并读取返回结果的完整逻辑。
原理与准备
Whois服务是用于查询域名和IP地址注册信息的分布式数据库系统。客户端需要连接到特定顶级域名(如.com、.cn)对应的权威服务器,通常监听在TCP 43端口。PHP可以通过其标准库中的fsockopen函数发起此类连接,获取文本形式的响应结果。
第1步:构建服务器映射表
目的:根据用户输入的域名后缀,找到对应的查询入口。由于不同后缀由不同的注册局管理,我们需要预先维护一个后缀到服务器地址的列表。
说明:该列表包含主流后缀的查询服务器。
$servers = array(
"biz" => "whois.neulevel.biz",
"com" => "whois.internic.net",
"net" => "whois.internic.net",
"org" => "whois.pir.org",
"cn" => "whois.cnnic.net.cn",
"us" => "whois.nic.us"
// ...此处省略其他后缀映射
);
第2步:域名清洗与后缀提取
操作:接收到的输入可能包含http://前缀或www.子域名,需将其剥离以确保提取正确的后缀。
动作:首先移除常见的URL前缀,然后以点号为界截取最后一段作为后缀。
$domain = strtolower(trim($domain));
$domain = preg_replace('/^http:\/\//i', '', $domain);
$domain = preg_replace('/^www\./i', '', $domain);
$domain = explode('/', $domain);
$domain = trim($domain[0]);
$_domain = explode('.', $domain);
$ext = $_domain[count($_domain)-1];
第3步:建立连接并发送请求
注意:执行网络I/O操作时,建议设置超时时间以防程序挂起。此外,某些大型服务器可能会拒绝来自普通脚本的直接连接,此时可能需要更换代理或IP段。
- 连接:调用
fsockopen传入步骤一中匹配的服务器及端口43。 - 写入:将处理后的域名字符串加上换行符(
\r\n)发送给服务器。 - 读取:循环读取直到文件结束(EOF),拼接结果。
if ($conn = fsockopen($nic_server, 43)) {
fputs($conn, $domain . "\r\n");
while(!feof($conn)) {
$output .= fgets($conn, 128);
}
fclose($conn);
} else {
die("Error: Connect failed.");
}
注意事项与维护
服务器失效问题:示例代码中引用的部分历史服务器(如whois.internic.net)近年来已逐渐停用或被重定向。在实际应用中,应查阅最新的ICANN Whois Server列表替换其中的映射关系。
超时设置:在网络环境复杂的场景下,务必给fsockopen添加第三个参数$timeout,否则如果目标服务器无响应,PHP进程将长时间卡死。
以上就是PHP实现Whois查询的详细步骤,更多关于PHP网络编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













