我有一个要解析为 IP 地址的 20.000 个域的列表。我正在寻找在 php 中执行此操作的最快方法。
我用过gethostbynamel()
,但是太慢了。我正在寻找另一个可以过滤掉根本不存在的主机然后运行的命令gethostbynamel()
- 我试过
checkdnsrr("host.com","A")
了,但是太慢了。 curl
也太慢了。
我有一个要解析为 IP 地址的 20.000 个域的列表。我正在寻找在 php 中执行此操作的最快方法。
我用过gethostbynamel()
,但是太慢了。我正在寻找另一个可以过滤掉根本不存在的主机然后运行的命令gethostbynamel()
checkdnsrr("host.com","A")
了,但是太慢了。curl
也太慢了。它不会变得更快。您必须联系每个域以查看它们是否可用。即使平均往返时间约为 50 毫秒,您也需要 15 分钟以上的时间来检查所有 20000 个域。那就是如果您不必等待超时。
如果您使这个多线程,您只会变得更快。您可以轻松设置 10 个线程以并行连接到 10 个服务器,这也将处理时间缩短了 10 个。
但是 PHP 并不是真正为多线程设计的,因此您可能需要使用其他工具。
但是你到底为什么要查看 20.000 个域呢?应该是什么鱼。。
一些想法:
假设地址可能不正确,请在尝试解析它们之前运行正则表达式来验证它们的格式。
将属于同一域的地址分类到相似的组中,并为该组检查该域一次,而不是为每个地址检查一次
这需要运行多次还是只运行一次?如果多次,您可以考虑使用诸如 apc 或 zend 缓存之类的缓存来缓存 ip,或者以其他方式(文件或 db)存储 IP,并测试该 ip 以查看它是否解析,如果没有,请尝试新的dns 调用
将任务分成多个子任务(几个php进程)
确定最适合您的 DNS 服务器,并使用它。Pear 有一个 net dns包,其功能可能适合您的需求。
脚本1.php
<?
if (!$argv[1]) exit;
$ip = gethostbynamel($argv[1]);
// do something
?>
脚本2.php
<?
$domains = array();
foreach($domains as $domain){
shell_exec("php script1.php $domain");
}
?>
不过可能内存不足。