首先是iplocation的安装: iplocation是php的一个扩展,将ip地址库预读到内存。 wget https://php-tokyocabinet.googlecode.com/files/php-iplocation.tar.bz2 tar jxvf php-iplocation.tar.bz2 cd php-iplocation #注:php路径请修改成实际环境的 /usr/local/webserver/php/bin/phpize ./configure –with-php-config=/usr/local/webserver/php/bin/php-config –with-iplocation make && make install #注:安装目录有个默认的ip地址库,37万多条ip数据,不过也可以到纯真ip下载最新的ip地址库,然后导出文本文件,把空格分隔换成|分隔即可 cp c_ip.txt /data/ip.dict vi /usr/local/webserver/php/etc/php.d/iplocation.ini # add [iplocation] iplocation.dict = "/data/ip.dict" extension=/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/iplocation.so php端用法 看一下源码里iplocation.c,只提供了两个函数,iplocation_fetch和iplocation_count print_r(iplocation_fetch(“202.38.64.1″)); 有一点要注意,因为是预载入,所以更新ip地址库文件,要重启php-fpm,才会生效 redis的安装: wget http://redis.googlecode.com/files/redis-2.4.11.tar.gz tar zxf redis-2.4.11.tar.gz && cd redis-2.4.11 make make PREFIX=/usr/local install #然后配置 mkdir /etc/redis cp redis.conf /etc/redis/redis.conf mkdir /var/lib/redis vi /etc/redis/redis.conf #详细的配置项就不讲了,网上有很多 #然后启动redis redis-server /etc/redis/redis.conf #安装php-redis,这个包很难找啊,有需要的可以单独向我要 tar zxf owlient-phpredis-2.1.1-1-g90ecd17.tar.gz && cd owlient-phpredis-90ecd17/ #以下php路径是我的环境,把路径换成你的就可以了 /usr/local/webserver/php/bin/phpize ./configure -with-php-config=/usr/local/webserver/php/bin/php-config make && make install vi /usr/local/webserver/php/etc/php.d/redis.ini #add extension=/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/redis.so 确保iplocation和redis安装正确,哦,还有中国气象的地区数据,http://www.hao535.com/wp-content/uploads/2013/04/area.rar 接下来就可以使用下面代码了: <?php class weather{ // 省和省会 private $capital = array( '黑龙江省'=>'哈尔滨市', '吉林省'=>'长春市', '辽宁省'=>'沈阳市', '河北省'=>'石家庄市', '山西省'=>'太原市', '山东省'=>'济南市', '青海省'=>'西宁市', '甘肃省'=>'兰州市', '陕西省'=>'西安市', '河南省'=>'郑州市', '江苏省'=>'南京市', '四川省'=>'成都市', '湖北省'=>'武汉市', '安徽省'=>'合肥市', '浙江省'=>'杭州市', '湖南省'=>'长沙市', '江西省'=>'南昌市', '贵州省'=>'贵阳市', '福建省'=>'福州市', '台湾省'=>'台北市', '云南省'=>'昆明市', '广东省'=>'广州市', '海南省'=>'海口市', '上海市'=>'上海', '北京市'=>'北京', '天津市'=>'天津', '重庆市'=>'重庆', '香港'=>'香港', '澳门'=>'澳门', '新疆'=>'乌鲁木齐市', '内蒙古'=>'呼和浩特市', '宁夏'=>'银川市', '西藏'=>'拉萨市', '广西'=>'南宁市' ); public $province = '北京';// 默认 public $city = '北京';// 默认 // 获取ip static function getIP(){ $ip = '127.0.0.1'; if(isset($_SERVER)){ if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; }else if(isset($_SERVER["HTTP_CLIENT_IP"])) { $ip = $_SERVER["HTTP_CLIENT_IP"]; }else{ $ip = $_SERVER["REMOTE_ADDR"]; } }else{ if(getenv("HTTP_X_FORWARDED_FOR")){ $ip = getenv("HTTP_X_FORWARDED_FOR"); }else if(getenv("HTTP_CLIENT_IP")) { $ip = getenv("HTTP_CLIENT_IP"); }else{ $ip = getenv("REMOTE_ADDR"); } } return $ip; } public function setArea($addr){ // 分割省市 foreach($this->capital as $p => $c){ if(strpos($addr,$p) === 0){ $this->province = str_replace(array('省','市'),'',$p); $this->city = substr($addr,strlen($p)); if($this->city == ''){ $this->city = $c;// 默认省会 } } } } public function getAreaCode(){ $code = '101010100';// 默认北京 // 到本地地区库里找中国气象地区编码,可以把序列化数据直接反序列化后放到本文件里,会更快 $area = file_get_contents("area.php"); $area = unserialize($area); //print_r($area); $province = array(); foreach($area as $k => $v){ $province[$k] = $v['level0']; } $pid = array_search($this->province,$province); if($pid !== false){ $citys = $area[$pid]['level1']; $cityid = array_search($this->city,$citys); if($cityid !== false){ $code = '101'.$cityid.'01'; }else{ $code = '101'.$pid.'0101'; } } return $code; } } /* 纯真ip库返回的地区格式如下: xx省xx市 或者 xx市 如果是自治区则为:新疆乌鲁木齐市,分割省市极麻烦 */ $weather = new weather(); // php的扩展iplocation $addrarr = iplocation_fetch(weather::getIP()); $addr = iconv('gbk','utf-8',$addrarr['province']); $weather->setArea($addr); $code = $weather->getAreaCode(); // 尝试从redis里读取天气数据 $redis_host = '127.0.0.1'; $redis_port = 6379; /* redis connect */ $redis = new Redis(); $redis->connect($redis_host, $redis_port); $data = $redis->get($code); if(!$data){ // 从中国气象去抓,并存入redis $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "http://m.weather.com.cn/data/{$code}.html"); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt ($curl, CURLOPT_TIMEOUT, 30 ); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); curl_close($curl); if($data){ $redis->set($code,$data); $redis->EXPIRE($code,3600); }else{ echo 'weather.com.cn 连接超时'; } } print_r($data);
Comments : 0