Web Programming/PHP2008. 7. 3. 13:55
출처: 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