📄 geoip.inc
字号:
($gi->databaseType == GEOIP_CITY_EDITION_REV1) || ($gi->databaseType == GEOIP_ORG_EDITION) || ($gi->databaseType == GEOIP_ISP_EDITION) || ($gi->databaseType == GEOIP_ASNUM_EDITION)){ $gi->databaseSegments = 0; $buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH); for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){ $gi->databaseSegments += (ord($buf[$j]) << ($j * 8)); } if (($gi->databaseType == GEOIP_ORG_EDITION)|| ($gi->databaseType == GEOIP_ISP_EDITION)) { $gi->record_length = ORG_RECORD_LENGTH; } } break; } else { $offset -= 4; } } if (($gi->databaseType == GEOIP_COUNTRY_EDITION)|| ($gi->databaseType == GEOIP_PROXY_EDITION)|| ($gi->databaseType == GEOIP_NETSPEED_EDITION)){ $gi->databaseSegments = GEOIP_COUNTRY_BEGIN; } } else { $filepos = ftell($gi->filehandle); fseek($gi->filehandle, -3, SEEK_END); for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) { $delim = fread($gi->filehandle,3); if ($delim == (chr(255).chr(255).chr(255))){ $gi->databaseType = ord(fread($gi->filehandle,1)); if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){ $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0; } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){ $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1; } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0) || ($gi->databaseType == GEOIP_CITY_EDITION_REV1) || ($gi->databaseType == GEOIP_ORG_EDITION) || ($gi->databaseType == GEOIP_ISP_EDITION) || ($gi->databaseType == GEOIP_ASNUM_EDITION)){ $gi->databaseSegments = 0; $buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH); for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){ $gi->databaseSegments += (ord($buf[$j]) << ($j * 8)); } if ($gi->databaseType == GEOIP_ORG_EDITION) { $gi->record_length = ORG_RECORD_LENGTH; } } break; } else { fseek($gi->filehandle, -4, SEEK_CUR); } } if (($gi->databaseType == GEOIP_COUNTRY_EDITION)|| ($gi->databaseType == GEOIP_PROXY_EDITION)|| ($gi->databaseType == GEOIP_NETSPEED_EDITION)){ $gi->databaseSegments = GEOIP_COUNTRY_BEGIN; } fseek($gi->filehandle,$filepos,SEEK_SET); } return $gi;}function geoip_open($filename, $flags) { $gi = new GeoIP; $gi->flags = $flags; if ($gi->flags & GEOIP_SHARED_MEMORY) { $gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0); } else { $gi->filehandle = fopen($filename,"rb"); if ($gi->flags & GEOIP_MEMORY_CACHE) { $s_array = fstat($gi->filehandle); $gi->memory_buffer = fread($gi->filehandle, $s_array[size]); } } $gi = _setup_segments($gi); return $gi;}function geoip_close($gi) { if ($gi->flags & GEOIP_SHARED_MEMORY) { return true; } return fclose($gi->filehandle);}function geoip_country_id_by_name($gi, $name) { $addr = gethostbyname($name); if (!$addr || $addr == $name) { return false; } return geoip_country_id_by_addr($gi, $addr);}function geoip_country_code_by_name($gi, $name) { $country_id = geoip_country_id_by_name($gi,$name); if ($country_id !== false) { return $gi->GEOIP_COUNTRY_CODES[$country_id]; } return false;}function geoip_country_name_by_name($gi, $name) { $country_id = geoip_country_id_by_name($gi,$name); if ($country_id !== false) { return $gi->GEOIP_COUNTRY_NAMES[$country_id]; } return false;}function geoip_country_id_by_addr($gi, $addr) { $ipnum = ip2long($addr); return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;}function geoip_country_code_by_addr($gi, $addr) { $country_id = geoip_country_id_by_addr($gi,$addr); if ($country_id !== false) { return $gi->GEOIP_COUNTRY_CODES[$country_id]; } return false;}function geoip_country_name_by_addr($gi, $addr) { $country_id = geoip_country_id_by_addr($gi,$addr); if ($country_id !== false) { return $gi->GEOIP_COUNTRY_NAMES[$country_id]; } return false;}function _geoip_seek_country($gi, $ipnum) { $offset = 0; for ($depth = 31; $depth >= 0; --$depth) { if ($gi->flags & GEOIP_MEMORY_CACHE) { $buf = substr($gi->memory_buffer, 2 * $gi->record_length * $offset, 2 * $gi->record_length); } elseif ($gi->flags & GEOIP_SHARED_MEMORY) { $buf = @shmop_read ($gi->shmid, 2 * $gi->record_length * $offset, 2 * $gi->record_length ); } else { fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0 or die("fseek failed"); $buf = fread($gi->filehandle, 2 * $gi->record_length); } $x = array(0,0); for ($i = 0; $i < 2; ++$i) { for ($j = 0; $j < $gi->record_length; ++$j) { $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8); } } if ($ipnum & (1 << $depth)) { if ($x[1] >= $gi->databaseSegments) { return $x[1]; } $offset = $x[1]; } else { if ($x[0] >= $gi->databaseSegments) { return $x[0]; } $offset = $x[0]; } } trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR); return false;}function _get_org($gi,$ipnum){ $seek_org = _geoip_seek_country($gi,$ipnum); if ($seek_org == $gi->databaseSegments) { return NULL; } $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments; if ($gi->flags & GEOIP_SHARED_MEMORY) { $org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH); } else { fseek($gi->filehandle, $record_pointer, SEEK_SET); $org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH); } $org_buf = substr($org_buf, 0, strpos($org_buf, 0)); return $org_buf;}function geoip_org_by_addr ($gi,$addr) { if ($addr == NULL) { return 0; } $ipnum = ip2long($addr); return _get_org($gi, $ipnum);}function _get_region($gi,$ipnum){ if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){ $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0; if ($seek_region >= 1000){ $country_code = "US"; $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65); } else { $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region]; $region = ""; } return array ($country_code,$region); } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) { $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1; //print $seek_region; if ($seek_region < US_OFFSET){ $country_code = ""; $region = ""; } else if ($seek_region < CANADA_OFFSET) { $country_code = "US"; $region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65); } else if ($seek_region < WORLD_OFFSET) { $country_code = "CA"; $region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65); } else { $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE]; $region = ""; } return array ($country_code,$region); }}function geoip_region_by_addr ($gi,$addr) { if ($addr == NULL) { return 0; } $ipnum = ip2long($addr); return _get_region($gi, $ipnum);}function getdnsattributes ($l,$ip){ $r = new Net_DNS_Resolver(); $r->nameservers = array("ws1.maxmind.com"); $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN"); $str = is_object($p->answer[0])?$p->answer[0]->string():''; ereg("\"(.*)\"",$str,$regs); $str = $regs[1]; return $str;}?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -