由于公司的业务,要对全部的用户做一个统计,来分析各省地区的用户分部情况,自己首先想到了通过PHP程序来调用第三方的IP查询接口,来实现统计用户的目的。下面就是程序源码。
原理:先把公司业务数据库中的访问IP导入到文档中,以一个IP一行为准;编写调用接口函数,我调用的是腾讯的IP查询接口;再对每一个IP进行查询,最后把结果写入到新的文件中,并且显示在浏览器下。
由于数据量太大,一个月的访问量,经过排序去重之后,仍然有600多万,仅仅通过这个程序,是要占用大量的时间的,所以对我们公司此业务行不通,后面又用其他方法来实现的。首先找到各个省市的IP段分配情况,把IP地址转换为无符号的长整型(int unsigned),把上百万的IP通过PHP的ip2long或者mysql的inet_aton函数转换为int unsigned写入数据库,再进行对比,效率得到了极大的提升。此处就不在多说,会有更详细的文档放在此博客中。
这里把php获取IP地址信息的源码粘贴:
# cat iploc.php
header('Content-Type=text/html;Charset=GB2312');
function getIPLoc_QQ($queryIP){
$url = ''.$queryIP;
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
$result = curl_exec($ch);
curl_close($ch);
preg_match("@(.*)@iU",$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}
echo "Writing file......
";
$f= fopen("ip.txt","r"); //要读取的文件
$fp= fopen("newip.txt","a+"); //要写入的文件,这两个文件的权限为apache.apache
/*
首先通过fgets函数逐行读取包含IP地址的文件,通过函数str_replace把每一行的回车去除;
再把IP地址写入到新文件中;然后通过上面自定义的函数getIPLoc_QQ来获取IP对应的地区;
为了在浏览器在正确的显示,通过字符集转换函数mb_convert_encoding把UTF8转换为GB2312;
最近关闭文件。
*/
while (!feof($f))
{
$ip = fgets($f);
echo $ip;
$ip = str_replace("\n","","$ip");
fwrite($fp,$ip);
fwrite($fp,"\t");
$add = getIPLoc_QQ($ip);
fwrite($fp,$add);
$add = mb_convert_encoding($add, "utf-8", "gb2312");
echo $add."
";
fwrite($fp,"\n");
}
fclose($f);
fclose($fp);
echo "OK";
?>
写入文件的内容如下:
# vim newip.txt
124.166.244.156 中国山西省阳泉市盂县 网通
124.166.244.157 中国山西省阳泉市盂县 网通
124.166.245.91 中国山西省阳泉市盂县 网通
124.166.246.16 中国山西省阳泉市盂县 网通
221.194.176.37 中国北京市通州区 网通
221.194.177.184 中国山东省济南市天桥区 网通
221.194.177.187 中国山东省济南市市中区 网通
网页显示如下:
Writing file......
124.166.244.156 中国山西省阳泉市盂县 网通
124.166.244.157 中国山西省阳泉市盂县 网通
124.166.245.91 中国山西省阳泉市盂县 网通
124.166.246.16 中国山西省阳泉市盂县 网通
221.194.176.37 中国北京市通州区 网通
221.194.177.184 中国山东省济南市天桥区 网通
221.194.177.187 中国山东省济南市市中区 网通
221.194.177.23 中国山东省济南市历下区 网通
阅读(2857) | 评论(0) | 转发(0) |