>백엔드 개발 >PHP 튜토리얼 >php_php 팁에서 IP 위치를 쿼리하는 방법

php_php 팁에서 IP 위치를 쿼리하는 방법

WBOY
WBOY원래의
2016-05-16 20:28:50954검색

이 기사의 예에서는 PHP에서 IP 위치를 쿼리하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요.

구체적인 구현 방법은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
/**
*@ 날짜 2010.12.21
참고: 파일 헤더 [첫 번째 인덱스의 오프셋 주소(4byte)] [마지막 인덱스의 오프셋 주소(4byte)] 8바이트
기록 영역 [끝 IP(4byte)] [지역 1] [지역 2]                                                                                      ~ 인덱스 영역 [시작 IP(4BYTE)] [Disposter 주소(3byte)] 7바이트
*/
수업 IP위치{
var $fp
var $firstip; //첫 번째 IP 인덱스의 오프셋 주소
var $lastip; //마지막 IP 인덱스의 오프셋 주소
var $totalip; //총 IP 수
/*
|------------------------------------------------- -------------
| 생성자, 일부 변수 초기화
|------------------------------------------------- -------------

| */
함수 iplocation($datfile = "qqwry.dat"){
$this->fp=fopen($datfile,'rb')or die("qqwry.dat가 존재하지 않습니다. 온라인으로 이동하세요이노센스 IP 데이터베이스 'qqwry.dat'를 다운로드하여 현재 디렉터리에 넣습니다."); //바이너리 모드로 열기
$this->firstip = $this->get4b() //첫 번째 IP 인덱스의 절대 오프셋 주소
$this->lastip = $this->get4b() //마지막 IP 인덱스의 절대 오프셋 주소
$this->totalip =($this->lastip - $this->firstip)/7; // 총 ip 수입니다. 인덱스 영역은 7바이트로 나누어져야 합니다. 7
Register_shutdown_function(array($this,"closefp")); //php5 이하 버전과 호환되기 위해 이 클래스는 소멸자를 사용하지 않으며 자동으로 ip 라이브러리를 닫습니다. }
/*
|------------------------------------------------- -------------
| IP 라이브러리 닫기
|------------------------------------------------- -------------

| */
함수 closefp(){
fclose($this->fp)
}
/*
|------------------------------------------------- -------------
| 4바이트를 읽고 긴 모드로 압축 해제
|------------------------------------------------- -------------

| */
함수 get4b(){
$str=unpack("v",fread($this->fp,4))
$str[1] 반환
}
/*
|------------------------------------------------- -------------
| 리디렉션된 오프셋 주소 읽기
|------------------------------------------------- -------------

| */
함수 getoffset(){
$str=unpack("v",fread($this->fp,3).chr(0))
$str[1] 반환
}
/*
|------------------------------------------------- -------------
| IP의 자세한 주소 정보 읽기
|------------------------------------------------- -------------

| */
함수 getstr(){
$split=fread($this->fp,1)
while (ord($split)!=0) {
$str .=$분할
$split=fread($this->fp,1)
}
$str 반환
}
/*
|------------------------------------------------- -------------
| ip2long을 통해 해당 IP를 ipv4 인터넷 주소로 변환한 후 인덱스 영역의 IP 주소와 비교하기 위해 빅엔디안 바이트 순서로 압축합니다
|------------------------------------------------- -------------

| */
함수 iptoint($ip){
return pack("n",intval(ip2long($ip)))
}
/*
|------------------------------------------------- -------------
| 주소 정보 가져오기
|------------------------------------------------- -------------

| */
함수 readaddress(){
$now_offset=ftell($this->fp) //현재 포인터 주소를 가져옵니다
$flag=$this->getflag()
스위치(ord($flag)){
사례 0:
$주소=""
휴식
사례 1:
사례 2:
fseek($this->fp,$this->getoffset())
$address=$this->getstr()
휴식
기본값:
fseek($this->fp,$now_offset)
$address=$this->getstr()
휴식
}
$주소 반환
}
/*
|------------------------------------------------- -------------
| 플래그 1 또는 2를 가져와서 주소가 리디렉션되는지 확인하세요.
|------------------------------------------------- -------------

| */
함수 getflag(){
return fread($this->fp,1); }
/*
|------------------------------------------------- -------------
| 이진 검색 방법을 사용하여 인덱스 영역에서 IP를 검색합니다
|------------------------------------------------- -------------

| */
함수 searchip($ip){
$ip=gethostbyname($ip); //도메인 이름을 IP로 변환
$ip_offset["ip"]=$ip
$ip=$this->iptoint($ip); //ip를 긴 정수로 변환
정의 ~               //검색 상한
$lastip=$this->totalip; //검색 하위 경계
$ipoffset=$this->lastip; //마지막 IP 주소의 오프셋 주소로 초기화
while ($firstip <= $lastip){
$i=floor(($firstip $lastip) / 2); //대략적인 중간 기록 계산 바닥 함수는 직설적으로 말하면 반올림을 의미합니다. fseek($this->fp,$this->firstip $i * 7); //가운데 레코드에 대한 포인터 찾기
$startip=strrev(fread($this->fp,4)); //현재 인덱스 영역의 시작 IP 주소를 읽고 리틀엔디안 바이트 순서를 빅엔디안 바이트 순서로 변환합니다.
if ($ip < $startip) {
$lastip=$i - 1; }
그렇지 않으면 {
fseek($this->fp,$this->getoffset())
$endip=strrev(fread($this->fp,4)); if ($ip > $endip){
$firstip=$i 1; }
그렇지 않으면 {
$ip_offset["offset"]=$this->firstip $i * 7; 휴식
}
}
}
$ip_offset 반환
}
/*
|------------------------------------------------- -------------
| IP 주소 세부정보 가져오기
|------------------------------------------------- -------------

| */
함수 getaddress($ip){
$ip_offset=$this->searchip($ip); //인덱스 영역에서 ip의 절대 오프셋 주소를 가져옵니다
$ipoffset=$ip_offset["오프셋"]
$address["ip"]=$ip_offset["ip"]
fseek($this->fp,$ipoffset); //인덱스 영역 찾기
$address["startip"]=long2ip($this->get4b()) //인덱스 영역의 시작 IP 주소
$address_offset=$this->getoffset(); //IP 레코드 영역의 인덱스 영역에 있는 IP의 오프셋 주소를 가져옵니다
fseek($this->fp,$address_offset); //기록 영역 찾기
$address["endip"]=long2ip($this->get4b()); //기록 영역의 끝 IP 주소
$flag=$this->getflag() //플래그 바이트 읽기
스위치(ord($flag)) {
사례 1: //지역 1과 지역 2가 리디렉션됩니다
$address_offset=$this->getoffset() //리디렉션 주소 읽기
fseek($this->fp,$address_offset); //리디렉션된 주소에 대한 포인터 찾기
$flag=$this->getflag() //플래그 바이트 읽기
스위치(ord($flag)) {
사례 2: //지역 1이 다시 리디렉션됩니다.
fseek($this->fp,$this->getoffset())
$address["area1"]=$this->getstr()
fseek($this->fp,$address_offset 4) //4바이트 점프
$address["area2"]=$this->readaddress(); //Area 2는 리디렉션될 수 있지만 리디렉션될 수는 없습니다
휴식
기본값: //지역 1과 지역 2에는 리디렉션이 없습니다
fseek($this->fp,$address_offset); //리디렉션된 주소에 대한 포인터 찾기
$address["area1"]=$this->getstr()
$address["area2"]=$this->읽기주소()
휴식
}
휴식
사례 2: //지역 1은 지역 2를 리디렉션하고 리디렉션하지 않습니다.
$address1_offset=$this->getoffset() //리디렉션 주소 읽기
fseek($this->fp,$address1_offset)
$address["area1"]=$this->getstr()
fseek($this->fp,$address_offset 8); $address["area2"]=$this->읽기주소()
휴식
기본값: //지역 1과 지역 2에는 리디렉션이 없습니다
fseek($this->fp,$address_offset 4); $address["area1"]=$this->getstr()
$address["area2"]=$this->읽기주소()
휴식
}
//*쓸데없는 데이터 필터링
if (strpos($address["area1"],"cz88.net")!=false){
$address["area1"]="알 수 없음"
}
if (strpos($address["area2"],"cz88.net")!=false){
$address["area2"]="
}
$주소 반환
}
}

/*사용법은 다음과 같습니다.*/
$ip=새 IP위치("qqwry.dat")
$address=$ip->getaddress("61.129.51.27")
//$address=$ip->getaddress(www.jb51.net)
echo '<사전>'; print_r($주소)
?>
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.