循环使用 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()的方式,通过打开多个浏览器页面来做的“多线程”…….(感觉很蠢….)
各位大佬有没有更好的解决方法。


新的方案

  1. 另写一个脚本将要处理的数据加工后放进redis里,原来的脚本读redis的最新数据,读取后释放内存,省去了查询数据库的操作,再将结果放入另一个redis队列里,通过第三个脚本去更新数据。
讨论数量: 2

每次都是查询吗? 这些域名数据是固定的吗? 可以事前起多个脚本预热,存起来,然后业务脚本去查询吗?

3年前 评论
Qcg (楼主) 3年前
Qcg (楼主) 3年前

两种方式

  1. 异步处理,用 Laravel 队列处理
  2. 花钱调用 httpdns 接口查询
3年前 评论
Qcg (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!