• 技术文章 >php教程 >PHP源码

    一个高效的根据IP自动显示天气预报的方案

    PHP中文网PHP中文网2016-05-25 17:05:37原创719
    php代码

    <?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);
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:php开发的简易扫雷游戏 下一篇:网站栏目导航当前页高亮设计

    相关文章推荐

    • 快速排序的算法• PHP 文件上传脚本• php面相对象的魔术方法中文说明与例子• PHP上传文件时如何自动分配的路径• PHP使用数组实现队列类程序

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网