我的客户订购了另一个脚本,但我无法弄清楚如何解决减速问题?该表有大约50,000行。
while($stats = mysql_fetch_array($get_stats)) {
if ($stats['ip'] == gethostbyaddr($stats['ip'])) { // new code
$is_undef = "Yes"; // causing problems
} else { $is_undef = "No"; } // end new code
echo "<tr><td>" . date("d M Y g:i a ", strtotime($stats['date'])) . "</td><td>" .
$stats['ip'] . "</td><td>" .
parse_url_domain($stats['ref_url']) . "</td><td>" .
$is_undef . "</td></tr>";
}
这是查询:
$get_stats = mysql_query("SELECT * FROM visitors WHERE site='$_GET[site]' AND date >= '$start_date' AND date <= '$end_date' ");
答案 0 :(得分:4)
我认为您可能遇到“gethostbyaddr”问题。循环超过50k次将非常慢。
此外,并不是说它与问题有关,但你可能想要考虑sql注入一点点。我希望这不是您正在运行的实际查询。如果是这样,有人可以放下你的桌子。
答案 1 :(得分:1)
我建议在之前执行此检查将每个地址添加到数据库表中(即每次查看数据时每次一次而不是50,000次!
答案 2 :(得分:0)
我猜gethostbyaddr()
很慢,因为它无法找到IP地址的主机。无论如何,以下表达的目的是什么?
$stats['ip'] == gethostbyaddr($stats['ip'])
假设$stats['ip']
为127.0.0.1
且相应的主机为localhost
。因此,您需要将127.0.0.1
(IP地址)与localhost
(主机名)进行比较。
答案 3 :(得分:0)
来自http://php.net/gethostbyaddr的评论:
“只是想让每个人都知道,如果IP地址未在DNS中列出,gethostbyaddr()需要超过20秒才能响应。”
我会说在循环中查看这些主机名可能会让你失望。
您发送给该查询的变量也需要正确转义,否则您真的会遇到麻烦。
答案 4 :(得分:0)
DNS请求可能需要很长时间,尤其是在50k记录中。如果您的客户端要求使用主机名而不是记录的IP地址,您可能希望运行某种后台进程来缓存主机名,而不是在每次加载页面时查找它们。
此外,大多数ISP都使用ip地址块,因此您可以开始构建跟踪IP范围的表和ISP的主机掩码来删除DNS查找
答案 5 :(得分:0)
我认为gethostbyaddr()调用会减慢你的速度。
请参阅http://us3.php.net/manual/en/function.gethostbyaddr.php#88920