다음 이전 차례

15. 부록 E 네트워크 관리 예제

이 화일을 얻으려면 웹브라우저에서 network.lib란 이름의 '텍스트(Text)' 형태로 저장하라.

PHP: network adminstrator's best friend from http://www.phpWizard.net

웹개발자로서 아마 ping, whois, nslookup 등등의 유용한 툴을 사용할것이다. 그러나 고객의 사무실에서 그 툴중 하나를 사용해야되는데 telnet을 사용할수 없다면 어떻게할것인가? PHP 매뉴얼의 '네트워크'에서 function을 찾아보는 것이 대안이다.

소켓 작동 :

가장 중요한 함수는 fsockopen()이다. 이함수를 사용하면 서버의 열려진 어떤 포트로도 접속할수 있고 소켓의 연결을 설정할수 있다. 함수의 문법은 다음과 같다 :


        int fsockopen(string hostname, int port, int [errno], string [errstr]);

앞의 2개의 변수는 쉽게 알수 있고, 다음의 2개의 변수는 옵션이고, 에러를 처리하기 위해 쓰인다. "errno"과 "errstr"은 참조를 통해서 이루어져야 한다. "참조를 통해 이루어진다"는 말의 의미는 원래의 변수가 변한다는 말이다. 보통, 함수가 실행되더라도 변수의 내용은 변하지 않는다.

그래서, 웹서버에 연결하기 위해 이함수를 사용하고 헤더를 프린트하라 :


function get_headers($host, $path = "/")
{
        $fp = fsockopen ("$host", 80, &$errnr, &$errstr) or die("$errno: $errstr");
        fputs($fp,"GET $path HTTP/1.0\n\n");
        while (!$end)
        {
                $line = fgets($fp, 2048);
                if (trim($line) == "")
                        $end = true;
                else
                        echo $line;
        }
        fclose($fp);
}

이 예제에서는 fsockopen()을 호출해서 얻은 파일포인터와 파일처리에 관한응용을 알아볼것이다.(fred, fwrite 등등) HTTP/1.0 클라이언트에서만 구현된다는것을 명심하라. - name-based 가상호스트에서는 동작하지 않는다.

지시:

일반적으로 다른 포트로 연결 할수 있다. PHP로 작은 핑거 클라이언트를 만든것은 쉬게 할수 있다. 핑거 데몬에 쿼리(질문)하기 위해 아래에 있는 예제를 수정하라.


function finger ($host, $user)
{
        $fp = fsockopen($host, 79, &$errno, &$errstr) or die("$errno: $errstr");
        fputs($fp, "$user\n");
        while (!feof($fp))
                echo fgets($fp, 128);
        fclose($fp);
}

Whois: 후이스(whois) 서버에 질문하는것도 같은 개념이다:


// domain is like "phpwizard.net"
function whois($domain, $server="whois.internic.net")
{
        $fp = fsockopen ($server, 43, &$errnr, &$errstr) or die("$errno: $errstr");
        fputs($fp, "$domain\n");
        while (!feof($fp))
                echo fgets($fp, 2048);
        fclose($fp);
}

블럭킹, 넌블록킹 제어 : 그러나 이함수를 사용하는데 문제가 있다. 다음과 같을때만 잘작동한다.

  1. 호출시간이 작은 연결일때와
  2. 연결하고 있는 서버가 살아있고 작동할때. 그렇지 않으면, 당신의 스크립트는 종료될때까지 작동한다. 그렇게 되는 이유는 소켓연결은 블럭킹되며 종료가 되지않기 때문이다. set_socket_blocking()이란 함수는 다음과 같이 동작한다: 함수는 모든동작을 소켓(첫번째 인수:소켓 포인터)에 블럭킹(두번재 인수:true)나 폴스(false)(세번째 인수:false)로 설정한다. 넌블럭킹제어를 사용하면, 핑거(finger)함수는 다음과 같을것이다:(역주:무슨말인지 번역이 이상하네요)


        $fp = fsockopen($host, 79, &$errno, &$errstr) or die("$errno: [ ] $errstr");
        set_socket_blocking($fp, 0);
        fputs($fp, "$user\n");

        $stop = time() + $timeout;
        while (!feof($fp) && time() < $stop )
                echo fgets($fp, 128);
        fclose($fp);

넌블러킹 소켓콜(socket calls)을 사용하기 위한 3개의 함수의 수정은 당신의 연습을 위해 남겨둔다.
다음 이전 차례