我在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.....
}
}
}
如何更快地获取它?
答案 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 = ''")