寻找一个更快的功能,然后“ gethostbyname”?

时间:2019-04-14 11:44:59

标签: php

我在xampp下使用mysqlDB运行脚本。

我检查域名是否具有IP。

问题是,我必须从MySQL_DB中检查超过100000个域名。

“ gethostbyname”功能很好用,但是我的解决方案太慢了。

while($row = mysqli_fetch_array($db_res)) { // get the DB domainnames entrys
    if (empty($row['status'])) {  
      $items[] =  $row['domainnames'];
    } 
    foreach ($items AS $domain) { 
        if ( gethostbyname($domain) != $domain ) {
            do somthing.....
        }
    }
}

如何更快地获取它?

3 个答案:

答案 0 :(得分:0)

好像您的while循环迭代时,它使用上次迭代中的$ items-这会浪费时间-因此请尝试使用此版本(将foreach放入if:

while($row = mysqli_fetch_array($db_res)) { // get the DB domainnames entrys
  if (empty($row['status'])) {  
    $items[] =  $row['domainnames'];
    foreach ($items AS $domain) { 
      if ( gethostbyname($domain) != $domain ) {
        do somthing.....
      }
    }
  } 
}

答案 1 :(得分:0)

foreach()循环内的while()循环简直是一个坏主意。想一想。  遍历结果集时,$items会不断膨胀-这意味着foreach()的工作时间将越来越长。

最终,如果您需要为脚本中的下一个任务处理gethostbyname()值,则应该在第一次将条目插入表中的同时存储该值-也许新列可以为host

聪明的钱是不打电话gethostbyname() 100000次;选择时已准备好值。


除了上述逻辑之外,我认为不需要声明具有单个元素/字符串的数组,然后对其进行迭代。

实际上,您的查询应包含WHERE子句,该子句排除具有null / 0 /空白status值的行,并包含具有host的行(匹配$domain的新列)值,这样php不必打扰任何限定/取消限定条件。

foreach ($db_res as $row) {  // yes, you can simply iterate the result object
    // do whatever with the associative string elements (e.g. $row['domainnames'])
    // ...you know this is a string and not an array, right? -^^^^^^^^^^^^^^^^^^^
}

答案 2 :(得分:0)

感谢您的回答。 在您的协助下,我可以将程序简化为:

while($row = mysqli_fetch_array($db_res))
{
        $domain =  $row['domainnames'];
       if ( gethostbyname($domain) != $domain ) {
    do somthing.....;
      }
    else{
do somthing.....;
    }
  }

感觉有点快,但还不够。 @mickmackusa我现在仅捕获空的“状态”字段:

$db_res = mysqli_query ($db_link, "select domainnames FROM domaintable WHERE status = ''")