[PHP5] ipv6 to number

개발/PHP 2016. 6. 21. 10:27
반응형

누군가 만들어놓고 간, PHP 서비스를 입사하자마자 떠맡았고, 

KPI니 뭐니 하면서, 기능 추가를 해야할 일이 있었는데, ipv6 주소를 받아다가 decimal format으로 변경해야할 일이 있었다.


역시 PHP라 구글에서 나돌아다니는 코드가 많았는데, 희한하게 geoip legacy파일에서 정의되어 있는 ipv6를 number로 변환한 값과는 조금 다르거나, 바이너리 형태로 리턴이 되어 알아볼 수 없는 형태로 나오는 경우가 많았다.


그러던 중 gmp_strval과 gmp_init을 사용하여 바이너리를 String으로 변경할 수 있는 라이브러리를 발견하여 시도해보니, 잘 동작을 해서 

php-gmp 라이브러리를 설치 후 작업을 시작하게 되었다.


1. php-gmp 설치

 - 당연한 얘기지만 사전에 php, php-fpm 등이 설치되어 있어야 하며, 아래 커맨드로 설치를 할 수 있는데

php-fpm 서비스가 몇초간 내려갔다가 올라오므로, 서비스 downtime이 발생하니 주의해야 한다.

$ apt-get install php-gmp


2. ipv6 address를 number로 변경하는 함수 구현

function ipv6_numeric($ipv6) {
    $ip_n = inet_pton($ipv6);
    $bits = 15;

	$ipv6long = 0;

    while($bits >= 0){
    $bin = sprintf("%08b",(ord($ip_n[$bits])));

        if($ipv6long) {
            $ipv6long = $bin . $ipv6long;
        } else {
            $ipv6long = $bin;
        }
        $bits--;
    }
    return gmp_strval(gmp_init($ipv6long, 2), 10);
}


3. ip address가 ipv6인지 ipv4인지 판단하는 함수 구현

function is_ipv6($ip) {
    return strpos($ip, ":") === false ? 4 : 6;
}


반응형

'개발 > PHP' 카테고리의 다른 글

[PHP5] error logging  (0) 2016.12.07
[PHP] mail function 호출 시 unable to qualify my own domain name  (0) 2016.11.28
,