Chinaunix首页 | 论坛 | 博客
  • 博客访问: 623127
  • 博文数量: 73
  • 博客积分: 1813
  • 博客等级: 上尉
  • 技术积分: 1213
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-27 19:59
文章分类
文章存档

2013年(1)

2012年(12)

2011年(28)

2010年(31)

2009年(1)

我的朋友

分类:

2011-08-10 11:38:43

   由于公司的业务,要对全部的用户做一个统计,来分析各省地区的用户分部情况,自己首先想到了通过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 中国山东省济南市历下区   网通
阅读(2850) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~