123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- <?php
- /**
- * Ip.php UTF-8
- * IP 地址处理
- *
- * @date : 2018/5/24 14:01
- *
- * @license 这不是一个自由软件,未经授权不许任何使用和传播。
- * @author : wuyonghong <wyh@huosdk.com>
- * @version : HUOSDK 8.0
- */
- namespace huolib\tool;
- class Ip {
- private static $ip = null;
- private static $fp = null;
- private static $offset = null;
- private static $index = null;
- private static $cached = array();
- public static function ins() {
- return new static();
- }
- /**
- * 获取IP归属地
- *
- * @param $ip
- *
- * @return string
- */
- public static function getIpHome($ip) {
- // TODO: wuyonghong 2018/5/24 获取IP归属地
- $_ip_location = self::find($ip);
- if (is_array($_ip_location)) {
- return implode($_ip_location, '|');
- }
- return '不明地址';
- }
- /**
- * IP转数字
- *
- * @param string $ip IP转数字
- *
- * @return int
- */
- public static function ipToLong($ip) {
- $_long = sprintf("%u", ip2long($ip));
- $_long = $_long ? $_long : 0;
- return $_long;
- }
- /**
- * IP转数字
- *
- * @param integer $long 数字转IP
- *
- * @return int|string
- */
- public static function longToIp($long = 0) {
- if (empty($long) || $long < 0) {
- return '0.0.0.0';
- }
- $_ip = long2ip($long);
- return $_ip;
- }
- /**
- * 判断是否是黑名单列表
- *
- * @param string $ip
- *
- * @return bool true 为黑名单 false 为不在黑名单中
- */
- public static function isBlackList($ip) {
- return false;
- }
- public static function find($ip) {
- if (empty($ip) === true) {
- return 'N/A';
- }
- $nip = gethostbyname($ip);
- $ipdot = explode('.', $nip);
- if ($ipdot[0] < 0 || $ipdot[0] > 255 || count($ipdot) !== 4) {
- return 'N/A';
- }
- if (isset(self::$cached[$nip]) === true) {
- return self::$cached[$nip];
- }
- if (self::$fp === null) {
- self::init();
- }
- $nip2 = pack('N', ip2long($nip));
- $tmp_offset = (int)$ipdot[0] * 4;
- $start = unpack(
- 'Vlen',
- self::$index[$tmp_offset].self::$index[$tmp_offset + 1].self::$index[$tmp_offset + 2]
- .self::$index[$tmp_offset + 3]
- );
- $index_offset = $index_length = null;
- $max_comp_len = self::$offset['len'] - 1024 - 4;
- for ($start = $start['len'] * 8 + 1024; $start < $max_comp_len; $start += 8) {
- if (self::$index{$start}.self::$index{$start + 1}.self::$index{$start + 2}.self::$index{$start + 3}
- >= $nip2
- ) {
- $index_offset = unpack(
- 'Vlen',
- self::$index{$start + 4}.self::$index{$start + 5}.self::$index{$start + 6}."\x0"
- );
- $index_length = unpack('Clen', self::$index{$start + 7});
- break;
- }
- }
- if ($index_offset === null) {
- return 'N/A';
- }
- fseek(self::$fp, self::$offset['len'] + $index_offset['len'] - 1024);
- $location = explode("\t", fread(self::$fp, $index_length['len']));
- $locationCode = self::getLocationCode($location);
- $location[] = $locationCode;
- self::$cached[$nip] = $location;
- return self::$cached[$nip];
- }
- private static function init() {
- if (self::$fp === null) {
- self::$ip = new self();
- $_file_path = GLOBAL_CONF_PATH.'extra/ip/17monipdb.dat';
- self::$fp = fopen($_file_path, 'rb');
- if (self::$fp === false) {
- throw new Exception('Invalid 17monipdb.dat file!');
- }
- self::$offset = unpack('Nlen', fread(self::$fp, 4));
- if (self::$offset['len'] < 4) {
- throw new Exception('Invalid 17monipdb.dat file!');
- }
- self::$index = fread(self::$fp, self::$offset['len'] - 4);
- }
- }
- private static function getLocationCode($arr) {
- $province = $arr[1];
- $city = $arr[2];
- $locationCode = [];
- $locationCode["北京"] = [
- "code" => "110000",
- "city" => [],
- ];
- $locationCode["天津"] = [
- "code" => "120000",
- "city" => [],
- ];
- $locationCode["河北"] = [
- "code" => "130000",
- "city" => ["石家庄市" => "130100", "唐山市" => "130200", "秦皇岛市" => "130300", "邯郸市" => "130400", "邢台市" => "130500",
- "保定市" => "130600", "张家口市" => "130700", "承德市" => "130800", "沧州市" => "130900", "廊坊市" => "131000",
- "衡水市" => "131100"],
- ];
- $locationCode["山西"] = [
- "code" => "140000",
- "city" => ["太原市" => "140100", "大同市" => "140200", "阳泉市" => "140300", "长治市" => "140400", "晋城市" => "140500",
- "朔州市" => "140600", "晋中市" => "140700", "运城市" => "140800", "忻州市" => "140900", "临汾市" => "141000",
- "吕梁市" => "141100"],
- ];
- $locationCode["内蒙古"] = [
- "code" => "150000",
- "city" => ["呼和浩特市" => "150100", "包头市" => "150200", "乌海市" => "150300", "赤峰市" => "150400", "通辽市" => "150500",
- "鄂尔多斯市" => "150600", "呼伦贝尔市" => "150700", "巴彦淖尔市" => "150800", "乌兰察布市" => "150900",
- "兴安盟" => "152200", "锡林郭勒盟" => "152500", "阿拉善盟" => "152900"],
- ];
- $locationCode["辽宁"] = [
- "code" => "210000",
- "city" => ["沈阳市" => "210100", "大连市" => "210200", "鞍山市" => "210300", "抚顺市" => "210400", "本溪市" => "210500",
- "丹东市" => "210600", "锦州市" => "210700", "营口市" => "210800", "阜新市" => "210900", "辽阳市" => "211000",
- "盘锦市" => "211100", "铁岭市" => "211200", "朝阳市" => "211300", "葫芦岛市" => "211400"],
- ];
- $locationCode["吉林"] = [
- "code" => "220000",
- "city" => ["长春市" => "220100", "吉林市" => "220200", "四平市" => "220300", "辽源市" => "220400", "通化市" => "220500",
- "白山市" => "220600", "松原市" => "220700", "白城市" => "220800", "延边朝鲜族自治州" => "222400"],
- ];
- $locationCode["黑龙江"] = [
- "code" => "230000",
- "city" => ["哈尔滨市" => "230100", "齐齐哈尔市" => "230200", "鸡西市" => "230300", "鹤岗市" => "230400",
- "双鸭山市" => "230500", "大庆市" => "230600", "伊春市" => "230700", "佳木斯市" => "230800", "七台河市" => "230900",
- "牡丹江市" => "231000", "黑河市" => "231100", "绥化市" => "231200", "大兴安岭地区" => "232700"],
- ];
- $locationCode["上海"] = [
- "code" => "310000",
- "city" => [],
- ];
- $locationCode["江苏"] = [
- "code" => "320000",
- "city" => ["南京市" => "320100", "无锡市" => "320200", "徐州市" => "320300", "常州市" => "320400", "苏州市" => "320500",
- "南通市" => "320600", "连云港市" => "320700", "淮安市" => "320800", "盐城市" => "320900", "扬州市" => "321000",
- "镇江市" => "321100", "泰州市" => "321200", "宿迁市" => "321300"],
- ];
- $locationCode["浙江"] = [
- "code" => "330000",
- "city" => ["杭州市" => "330100", "宁波市" => "330200", "温州市" => "330300", "嘉兴市" => "330400", "湖州市" => "330500",
- "绍兴市" => "330600", "金华市" => "330700", "衢州市" => "330800", "舟山市" => "330900", "台州市" => "331000",
- "丽水市" => "331100"],
- ];
- $locationCode["安徽"] = [
- "code" => "340000",
- "city" => ["合肥市" => "340100", "芜湖市" => "340200", "蚌埠市" => "340300", "淮南市" => "340400", "马鞍山市" => "340500",
- "淮北市" => "340600", "铜陵市" => "340700", "安庆市" => "340800", "黄山市" => "341000", "滁州市" => "341100",
- "阜阳市" => "341200", "宿州市" => "341300", "巢湖市" => "341400", "六安市" => "341500", "亳州市" => "341600",
- "池州市" => "341700", "宣城市" => "341800"],
- ];
- $locationCode["福建"] = [
- "code" => "350000",
- "city" => ["福州市" => "350100", "厦门市" => "350200", "莆田市" => "350300", "三明市" => "350400", "泉州市" => "350500",
- "漳州市" => "350600", "南平市" => "350700", "龙岩市" => "350800", "宁德市" => "350900"],
- ];
- $locationCode["江西"] = [
- "code" => "360000",
- "city" => ["南昌市" => "360100", "景德镇市" => "360200", "萍乡市" => "360300", "九江市" => "360400", "新余市" => "360500",
- "鹰潭市" => "360600", "赣州市" => "360700", "吉安市" => "360800", "宜春市" => "360900", "抚州市" => "361000",
- "上饶市" => "361100"],
- ];
- $locationCode["山东"] = [
- "code" => "370000",
- "city" => ["济南市" => "370100", "青岛市" => "370200", "淄博市" => "370300", "枣庄市" => "370400", "东营市" => "370500",
- "烟台市" => "370600", "潍坊市" => "370700", "济宁市" => "370800", "泰安市" => "370900", "威海市" => "371000",
- "日照市" => "371100", "莱芜市" => "371200", "临沂市" => "371300", "德州市" => "371400", "聊城市" => "371500",
- "滨州市" => "371600", "菏泽市" => "371700"],
- ];
- $locationCode["河南"] = [
- "code" => "410000",
- "city" => ["郑州市" => "410100", "开封市" => "410200", "洛阳市" => "410300", "平顶山市" => "410400", "安阳市" => "410500",
- "鹤壁市" => "410600", "新乡市" => "410700", "焦作市" => "410800", "濮阳市" => "410900", "许昌市" => "411000",
- "漯河市" => "411100", "三门峡市" => "411200", "南阳市" => "411300", "商丘市" => "411400", "信阳市" => "411500",
- "周口市" => "411600", "驻马店市" => "411700", "济源市" => "419001"],
- ];
- $locationCode["湖北"] = [
- "code" => "420000",
- "city" => ["武汉市" => "420100", "黄石市" => "420200", "十堰市" => "420300", "宜昌市" => "420500", "襄樊市" => "420600",
- "鄂州市" => "420700", "荆门市" => "420800", "孝感市" => "420900", "荆州市" => "421000", "黄冈市" => "421100",
- "咸宁市" => "421200", "随州市" => "421300", "恩施土家族苗族自治州" => "422800", "仙桃市" => "429004",
- "潜江市" => "429005", "天门市" => "429006", "神农架林区" => "429021"],
- ];
- $locationCode["湖南"] = [
- "code" => "430000",
- "city" => ["长沙市" => "430100", "株洲市" => "430200", "湘潭市" => "430300", "衡阳市" => "430400", "邵阳市" => "430500",
- "岳阳市" => "430600", "常德市" => "430700", "张家界市" => "430800", "益阳市" => "430900", "郴州市" => "431000",
- "永州市" => "431100", "怀化市" => "431200", "娄底市" => "431300", "湘西土家族苗族自治州" => "433100"],
- ];
- $locationCode["广东"] = [
- "code" => "440000",
- "city" => ["广州市" => "440100", "韶关市" => "440200", "深圳市" => "440300", "珠海市" => "440400", "汕头市" => "440500",
- "佛山市" => "440600", "江门市" => "440700", "湛江市" => "440800", "茂名市" => "440900", "肇庆市" => "441200",
- "惠州市" => "441300", "梅州市" => "441400", "汕尾市" => "441500", "河源市" => "441600", "阳江市" => "441700",
- "清远市" => "441800", "东莞市" => "441900", "中山市" => "442000", "潮州市" => "445100", "揭阳市" => "445200",
- "云浮市" => "445300"],
- ];
- $locationCode["广西"] = [
- "code" => "450000",
- "city" => ["南宁市" => "450100", "柳州市" => "450200", "桂林市" => "450300", "梧州市" => "450400", "北海市" => "450500",
- "防城港市" => "450600", "钦州市" => "450700", "贵港市" => "450800", "玉林市" => "450900", "百色市" => "451000",
- "贺州市" => "451100", "河池市" => "451200", "来宾市" => "451300", "崇左市" => "451400"],
- ];
- $locationCode["海南"] = [
- "code" => "460000",
- "city" => ["海口市" => "460100", "三亚市" => "460200", "五指山市" => "469001", "琼海市" => "469002",
- "儋州市" => "469003", "文昌市" => "469005", "万宁市" => "469006", "东方市" => "469007",
- "定安县" => "469021", "屯昌县" => "469022", "澄迈县" => "469023", "临高县" => "469024",
- "白沙黎族自治县" => "469025", "昌江黎族自治县" => "469026", "乐东黎族自治县" => "469027", "陵水黎族自治县" => "469028",
- "保亭黎族苗族自治县" => "469029", "琼中黎族苗族自治县" => "469030", "西沙群岛" => "469031", "南沙群岛" => "469032",
- "中沙群岛的岛礁及其海域" => "469033"],
- ];
- $locationCode["重庆"] = [
- "code" => "500000",
- "city" => [],
- ];
- $locationCode["四川"] = [
- "code" => "510000",
- "city" => ["成都市" => "510100", "自贡市" => "510300", "攀枝花市" => "510400", "泸州市" => "510500",
- "德阳市" => "510600", "绵阳市" => "510700", "广元市" => "510800", "遂宁市" => "510900",
- "内江市" => "511000", "乐山市" => "511100", "南充市" => "511300", "眉山市" => "511400",
- "宜宾市" => "511500", "广安市" => "511600", "达州市" => "511700", "雅安市" => "511800",
- "巴中市" => "511900", "资阳市" => "512000", "阿坝藏族羌族自治州" => "513200", "甘孜藏族自治州" => "513300",
- "凉山彝族自治州" => "513400"],
- ];
- $locationCode["贵州"] = [
- "code" => "520000",
- "city" => ["贵阳市" => "520100", "六盘水市" => "520200", "遵义市" => "520300", "安顺市" => "520400",
- "铜仁地区" => "522200", "黔西南布依族苗族自治州" => "522300", "毕节地区" => "522400",
- "黔东南苗族侗族自治州" => "522600", "黔南布依族苗族自治州" => "522700"],
- ];
- $locationCode["云南"] = [
- "code" => "530000",
- "city" => ["昆明市" => "530100", "曲靖市" => "530300", "玉溪市" => "530400", "保山市" => "530500",
- "昭通市" => "530600", "丽江市" => "530700", "普洱市" => "530800", "临沧市" => "530900",
- "楚雄彝族自治州" => "532300", "红河哈尼族彝族自治州" => "532500", "文山壮族苗族自治州" => "532600",
- "西双版纳傣族自治州" => "532800", "大理白族自治州" => "532900", "德宏傣族景颇族自治州" => "533100",
- "怒江傈僳族自治州" => "533300", "迪庆藏族自治州" => "533400"],
- ];
- $locationCode["西藏"] = [
- "code" => "540000",
- "city" => ["拉萨市" => "540100", "昌都地区" => "542100", "山南地区" => "542200", "日喀则地区" => "542300",
- "那曲地区" => "542400", "阿里地区" => "542500", "林芝地区" => "542600"],
- ];
- $locationCode["陕西"] = [
- "code" => "610000",
- "city" => ["西安市" => "610100", "铜川市" => "610200", "宝鸡市" => "610300", "咸阳市" => "610400", "渭南市" => "610500",
- "延安市" => "610600", "汉中市" => "610700", "榆林市" => "610800", "安康市" => "610900", "商洛市" => "611000"],
- ];
- $locationCode["甘肃"] = [
- "code" => "620000",
- "city" => ["兰州市" => "620100", "嘉峪关市" => "620200", "金昌市" => "620300", "白银市" => "620400", "天水市" => "620500",
- "武威市" => "620600", "张掖市" => "620700", "平凉市" => "620800", "酒泉市" => "620900", "庆阳市" => "621000",
- "定西市" => "621100", "陇南市" => "621200", "临夏回族自治州" => "622900", "甘南藏族自治州" => "623000"],
- ];
- $locationCode["青海"] = [
- "code" => "630000",
- "city" => ["西宁市" => "630100", "海东地区" => "632100", "海北藏族自治州" => "632200", "黄南藏族自治州" => "632300",
- "海南藏族自治州" => "632500", "果洛藏族自治州" => "632600", "玉树藏族自治州" => "632700", "海西蒙古族藏族自治州" => "632800"],
- ];
- $locationCode["宁夏"] = [
- "code" => "640000",
- "city" => ["银川市" => "640100", "石嘴山市" => "640200", "吴忠市" => "640300", "固原市" => "640400", "中卫市" => "640500"],
- ];
- $locationCode["新疆"] = [
- "code" => "650000",
- "city" => ["乌鲁木齐市" => "650100", "克拉玛依市" => "650200", "吐鲁番地区" => "652100", "哈密地区" => "652200",
- "昌吉回族自治州" => "652300", "博尔塔拉蒙古自治州" => "652700", "巴音郭楞蒙古自治州" => "652800", "阿克苏地区" => "652900",
- "克孜勒苏柯尔克孜自治州" => "653000", "喀什地区" => "653100", "和田地区" => "653200", "伊犁哈萨克自治州" => "654000",
- "塔城地区" => "654200", "阿勒泰地区" => "654300", "石河子市" => "659001", "阿拉尔市" => "659002",
- "图木舒克市" => "659003", "五家渠市" => "659004"],
- ];
- $code = "";
- if (!isset($locationCode[$province])) {
- return $code;
- }
- $code = $locationCode[$province]["code"];
- if (!empty($city)) {
- foreach ($locationCode[$province]["city"] as $key => $loc) {
- if (strpos($key, $city) !== false) {
- $code = $loc;
- break;
- }
- }
- }
- return $code;
- }
- public function __destruct() {
- if (self::$fp !== null) {
- fclose(self::$fp);
- }
- }
- }
|