我目前正在为其他人转换一个脚本,在他们的旧代码中,他们有一个 CSV 文件,列出了所有 IP 和他们的国家。该文件采用以下格式:
16777216 17367039 AU AUS AUSTRALIA
17367040 17432575 MY MYS MALAYSIA
17432576 17498111 AU AUS AUSTRALIA
17498112 17563647 KR KOR REPUBLIC OF KOREA
17563648 17825791 CN CHN CHINA
好吧,这就是他们所做的,我将它导入到新的 MySQL 数据库中。但问题是他们这里有 111K 的记录!
要进行比较并找到国家/地区的 IP,大约需要 40 秒。目前,他们选择所有记录并与小于和大于下一个字段进行比较。
$datafile = file("iplist.csv");
$countries = array();
foreach($datafile as $data) {
$data = explode(",", $data);
foreach($iplist as $ipan => $ip) {
if($ip > $data[0] && $ip < $data[1]) {
$countries[$ip] = array($data[2], $data[4]);
}
}
}
当然,我知道这是一种可怕的方法,太可怕了!当我在 MySQL 中做这件事时甚至更糟,我的意思是 111K 记录就在那里。
我整天都在绞尽脑汁,想不出更好的办法来做到这一点。IP 以标准格式存储在数据库中。我以为我会从 MySQL 中进行选择,然后在 where 语句中做一个多于和少于。但是对于我的生活,我可以想到如何。考虑到这就是他们制作 IP 列表的方式:
foreach($log as $row) {
$iplist[$row[2]] = $row[2];
if($last != "") {
$dif = $last-$row[5];
$avgtime += $dif;
}
$last = $row[5];
}
我曾想过每条记录进行一次调用,但如果每个统计页面上正常显示 120 条记录,那么这将是最少的 120 次 mysql 调用。
谁能给我一个更好,更有效的方法来进行这种比较?
我正在考虑使用外部服务,但请求太多了,我认为该网站会被列入黑名单。