循环使用 gethostbyname () 造成阻塞如何解决?
客户机上有大量的域名数据,期望得到这些域名的IP地址,我这边只有数据操作权限没有服务器相关权限。尝试的方法是常规的查询后foreach遍历用gethostbyname()获取域名IP。
.......
$ip = [];
foreach ($list as $v) {
try {
$domain = idn_to_ascii($v,IDNA_NONTRANSITIONAL_TO_ASCII,INTL_IDNA_VARIANT_UTS46);
$ip[] = gethostbyname($domain),
} catch (\Exception $e) {
dump($e->getMessage());
}
}
.........
问题在于,如果域名没做DNS解析或者域名服务器请求不到的话,gethostbyname()会保持长达4~5秒的延迟,这样我用浏览器AJAX执行脚本的时候经常出现503错误。经过调试后,每次执行10条返回时间少则几百ms,多则长达1分钟。效率低下。
目前我解决的方案是:
使用redis做第三方存储,初始化id => 1,程序获取redis当前id,查询下一条记录id,存到redis,执行gethostbyname()的方式,通过打开多个浏览器页面来做的“多线程”…….(感觉很蠢….)
各位大佬有没有更好的解决方法。
新的方案
- 另写一个脚本将要处理的数据加工后放进redis里,原来的脚本读redis的最新数据,读取后释放内存,省去了查询数据库的操作,再将结果放入另一个redis队列里,通过第三个脚本去更新数据。
推荐文章: