【发布时间】:2012-10-04 07:12:56
【问题描述】:
我目前正在为其他人转换脚本,在他们的旧代码中,他们有一个 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 调用。
谁能给我一个更好更有效的方法来进行比较?
我正在考虑使用外部服务,但请求太多,我认为该网站会被列入黑名单。
【问题讨论】:
-
为什么不直接导入呢?您没有说明为什么需要比较 IP。
-
因为在统计页面上它必须显示访问者来自哪个国家。因此IP到国家代码。 PHP 脚本必须确定 IP 来自哪个国家才能显示。