출처: http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=22731&sca=&sfl=wr_subject%7C%7Cwr_content&stx=&sop=and |
############################################################# ## PHP 로 구현한 XML_RPC ## 지은이 : 권기성 nonots@hanmail.net ## 지은때 : 2003/09/03 ## 소스위치 : http://nonots.unixedu.org ############################################################# 1. 개요 - XML RPC 는 xml 포맷의 데이타를 이용하여 원격서버의 프로시져(procedure)를 실행하는 방법중의 하나입니다. - 웹서비스를 구현하기위해 대부분 자바나 닷넷을 사용하고 있는데 PHP 에서도 XML_RPC 를 이용하여 웹서비스를 할 수 있음을 간단하게 보여줍니다. 2. 환경 - 운영체제 : 래드햇 7.3 - 웹환경 : 아파치 2.0.47, PHP 4.3.3 , Mysql 4.0.14 * php 컴파일시 --with-xml --with-xmlrpc 옵션을 추가 해야합니다. * 클래스에 따라 --with-xmlrpc 이 필요없는 경우도 있습니다. - XML_RPC 클래스 : Keith Devens 의 version 2.5c. 사용 * 참조 : http://www.keithdevens.com/software/xmlrpc/ 3. RPC 서버 : ace.hanathe.biz - 소스 위치 : http://ace.hanathe.biz/xmlrpc - 사용 소스 : kd_xmlrpc.php(기본클래스), server.php(서버), web_service_api.php(실제 실행할 함수정의) - Mysql 사용 우편번호 DB (알지보드에 있는) 4. RPC 클라이언트 : best.hanathe.biz - 소스 위치 : http://best.hanathe.biz/xmlrpc - 사용 소스 : kd_xmlrpc.php(기본클래스), zipcode.php(클라이언트) 5. 사용례 설명 - best 에서 원격서버(ace) 에 있는 우편번호 데이타베이스 검색 - http://best.hanathe.biz/xmlrpc/zipcode.php 1. 클라이언트(best.hanathe.biz) : zipcode.php ... /* 서버로 검색키 보낼때 */ $site = "ace.hanathe.biz"; $location = "/xmlrpc/server.php"; list($success, $response) = XMLRPC_request( $site, $location, 'post.Info', array(XMLRPC_prepare($_GET['key']), 'HanaTheBiz_Agent') ); // 서버이름과 URI , post.Info(서버의 메소드), 보냄 // array(XMLRPC_prepare($_GET['key']) 는 메소드가 사용할 매개변수를 배열로 넘김 // HanaTheBiz_Agent 는 에이전트이름으로 큰 의미 없음 // 이렇게 넘긴후 $success 로 성공,실패 여부 알수 있고 , 성공시 $response 배열로 // 서버의 실행 결과를 받는다. ... 2. 서버 : server.php /* 서비스해줄 함수(메소드)들이 정의된 파일 */ include("web_service_api.php"); /* 클라이언트에서 POST 로 넘어온 데이타를 변수에 할당 주고 받을 값의 크기 제한은 php.ini 의 POST 관련 제한에 종속 */ $xmlrpc_request = XMLRPC_parse($GLOBALS['HTTP_RAW_POST_DATA']); /* 클라이언터에서 보내온 값중에서 사용할 함수이름을 얻는다 이 함수가 위의 web_service_api.php 에 정의되어야 한다 */ $methodName = XMLRPC_getMethodName($xmlrpc_request); /* 함수에서 사용할 파라메터(매개변수)를 배열로 받는다. 예제에서는 $key 값 */ $params = XMLRPC_getParams($xmlrpc_request); /* Error check - 함수가 있는지 없는지체크 */ if(!isset($xmlrpc_methods[$methodName])){ $xmlrpc_methods['method_not_found']($methodName); /* 함수 있으면 실행후 xml_rpc 포맷으로 클라이언트에 전송 */ }else{ /* Call the method - notice $params[0] not just $params as the documentation states. */ $xmlrpc_methods[$methodName]($params[0]); } 3. 서버의 실제 함수(메소드) 정의 파일 : web_service_api.php .... /* xmlrpc 메소드에 대응하는 PHP 함수 이름 정의 */ $xmlrpc_methods = array(); // 우편번호정보(클라이언트에서는 post.Info로) $xmlrpc_methods['post.Info'] = post_Info; ## 우편번호 - 여기서 테스트한 건 알지보드에 있는 우편번호 DB 입니다. function post_Info($key=''){ $key = trim($key); $qry = "select * from rg_zip where zp_gugun like '%". $key ."%' or zp_dong like '%".$key."%'"; $rst = mysql_query($qry); if($rst){ while($row = mysql_fetch_array($rst)){ $post['code'] = $row['zp_code']; $post['sido'] = $row['zp_sido']; $post['gugun'] = $row['zp_gugun']; $post['dong'] = $row['zp_dong']; $post['bunji'] = $row['zp_bunji']; $post_all[] = $post; } /* $post_all 배열을 XML 형식으로 처리후 클라이언트에 응답 */ XMLRPC_response(XMLRPC_prepare($post_all), KD_XMLRPC_USERAGENT); } else { /* 에러일 경우 에러 반환 */ XMLRPC_error("1", "post_Info() 에러: 주소록을 읽을 수 없습니다.:" . mysql_error() . "\nQuery : " . $qry, KD_XMLRPC_USERAGENT); } } ... 6. 기타 - 주고 받는 데이타는 웹의 POST 방식으로 전달되므로 php.ini 에 설정된 값의 제한을 따릅니다. - 위 소스는 http://www.sitepoint.com/article/827/1 의 영문기사를 엉성하게(!) 읽고 테스트해 본 것입니다. 그러므로 실력되시는 분들은 반드시 원문을 읽으시길.. - phpxmlrpc (http://sourceforge.net/projects/phpxmlrpc/) 라는 클래스가 더 유명한거 같은데 현재 소스포지에서 다운이 안되어서 어쩔수 없이 위의 클래스를 사용했습니다. 이외에도 PEAR 에 있는 클래스도 있는데 사용법을 몰라 테스트해보지 못했습니다. |
Posted by BAGE