>  기사  >  백엔드 개발  >  PHP에서 IP를 정수로 변환하는 방법

PHP에서 IP를 정수로 변환하는 방법

藏色散人
藏色散人원래의
2021-11-01 09:56:551682검색

PHP에서 IP를 정수로 변환하는 방법: 1. PHP 샘플 파일을 생성합니다. 2. "ip2long($ip);" 메소드를 통해 IP 주소를 정수로 변환합니다.

PHP에서 IP를 정수로 변환하는 방법

이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

PHP를 사용하여 IP를 정수로 변환하는 방법은 무엇입니까?

PHP에서 IP 주소와 정수의 상호 변환에 대한 자세한 설명

이 글에서는 주로 PHP에서 IP 주소와 정수의 상호 변환에 대한 자세한 설명을 소개합니다. ip2long과 long2ip, 그리고 그 사용 BUG 소개, 그리고 마지막으로 제가 작성한 두 가지 알고리즘이 제공됩니다. 필요한 친구들이 참고할 수 있습니다

IP를 정수 저장소로 변환하는 것은 데이터베이스 최적화의 주요 추세입니다. 특히, 테이블의 데이터 양이 많거나, 특정 IP 세그먼트의 데이터를 쿼리하려는 경우에는 문자열 인덱스가 정수 인덱스보다 더 많은 리소스를 소비합니다. 이 기사의 범위에 포함되지 않습니다.

시스템 함수 ip2long 및 long2ip
PHP에는 IP 주소를 정수로 변환할 수 있는 ip2long 함수가 내장되어 있습니다.

코드는 다음과 같습니다:

$ip = '210.110.11.49';echo ip2long($ip);

출력:

-764540111

우리가 얻는 결과는 부호 있는 정수이기 때문에 출력 정수는 음수 부호를 갖습니다. 부호 있는 정수의 최대값은 2147483647입니다. 결과를 부호 없는 값으로 변환하려면

3530427185

long2ip를 사용하여 정수를 다시 IP 주소로 변환

$ip = '210.110.11.49';$ip_int = ip2long($ip);echo $ip."<br />";echo $ip_int."<br />";echo long2ip($ip_int);

출력:

210.110.011.49
-764540623
210.110.9.49

변환 결과가 일치하지 않습니다. 첫 번째 숫자 앞에 선행 0을 추가하려고 합니다. ip를 입력한 다음

$ip = '021.110.11.49';$ip_int = ip2long($ip);echo $ip."<br />";echo $ip_int."<br />";echo long2ip($ip_int);

출력을 살펴보세요.

021.110.11.49
292424497
17.110.11.49

변환 결과가 모두 잘못되었습니다. 위의 예는 모두 앞에 0이 추가되어 변환 결과에 오류가 발생하고 관련 반전 결과가 원래 변환된 IP와 일치하지 않기 때문입니다.

변환 원리

현재 두 가지 알고리즘이 있습니다.
첫 번째, 첫 번째 섹션에 256의 세제곱을 곱하고, 두 번째 섹션에 256의 제곱을 곱하고, 세 번째 섹션에 256을 곱하고, 최종 합계

$ip = '0210.110.11.49'; 
function ipToInt($ip){    $iparr = explode('.',$ip);    $num = 0;    for($i=0;$i<count($iparr);$i++){        $num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1));
    }    return $num;
} 
echo  $ip.'<br />';$ip_int = ipToInt($ip);echo $ip_int.'<br />';echo long2ip($ip_int);

출력:

0210.110.11.49
3530427185
210.110.11.49

두 번째, 비트 연산자 사용

$ip = '0210.110.11.49'; 
function ipToInt($ip){    $iparr = explode('.',$ip);    return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));
} 
echo  $ip.'<br />';$ip_int = ipToInt($ip);echo $ip_int.'<br />';echo long2ip($ip_int);

출력:

0210.110.11.49
-764540111
210.110.11.49

IP가 합법적인지 감지

먼저, 직접 감지를 통과

function check_ip($ip){    $iparr = explode('.',$ip);    foreach($iparr as $v){ if($v>255) return false; }    return true;
} 
echo '210.285.11.49,';var_dump(check_ip('210.285.11.49'));echo '<br />';echo '210.205.11.49,';var_dump(check_ip('210.205.11.49'));
[code]

输出:
[code]210.285.11.49,bool(false)210.205.11.49,bool(true)

두 번째, ip2long을 사용하여 return

function check_ip($ip){    if(ip2long($ip)) return true;    return false;
} 
echo '210.285.11.49,';var_dump(check_ip('210.285.11.49'));echo '<br />';echo '210.205.11.49,';var_dump(check_ip('210.205.11.49'));

출력:

210.285.11.49,bool(false)210.205.11.49,bool(true)

Postscript

많은 사람들이 ip 쓰기 라이브러리에 int 유형 필드를 저장하기 위해 ip2long 변환을 사용합니다. 그러나 다른 시스템 플랫폼에서는 ip2long 함수로 얻은 값이 다릅니다. 결과적으로 데이터베이스에서 데이터를 읽어 IP를 역전할 때 long2ip를 사용하여 얻은 IP가 원래 IP와 일치하지 않는 경우 mysql 시스템 함수 INET_ATON 및 INET_NTOA를 사용하여 문제를 해결할 수 있습니다. , 처리를 위해 bigint 유형을 사용하거나 함수를 직접 작성하세요.

추천 학습: "

PHP 비디오 튜토리얼"

위 내용은 PHP에서 IP를 정수로 변환하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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