json rpc는 json을 메시지 형식으로 사용하는 원격 호출 서비스입니다. 이는 다양한 운영 체제 및 다양한 환경에서 실행되는 프로그램이 인터넷 기반 프로세스 호출을 구현할 수 있도록 하는 일련의 사양 및 구현입니다. 이 원격 프로시저 호출은 http를 전송 프로토콜 또는 기타 전송 프로토콜로 사용할 수 있습니다. 전송되는 콘텐츠는 json 메시지 본문입니다.
아래에서는 PHP를 기반으로 한 RPC 프레임워크 세트를 코딩합니다. 이 프레임워크에는 RPC 서버와 애플리케이션 클라이언트가 포함됩니다.
(1) PHP 서버 RPCserver jsonRPCServer.php
비공개 $debug;
비공개 $url;
// ID를 입력하세요
비공개 $id;
비공개 $notification = false;
/**
* @param $url
* @param bool $debug
*/
공개 함수 __construct($url,$debug = false) {
// 서버 URL
$this->url = $url;
//프록시
비어 있음($프록시) ? $this->proxy = '' : $this->proxy = $proxy;
// 디버그 상태
비어 있음($debug) ? $this->debug = false : $this->debug = true;
// 메시지 ID
$this->id = 1;
}
/**
*
* @param 부울 $알림
*/
공개 함수 setRPCNotification($notification) {
비어 있음($notification) ? $this->notification = false : $this->notification = true;
}
/**
* @param $method
* @param $params
* @return 부울
* @예외 발생
*/
공개 함수 __call($method,$params) {
// 检验요청信息
if (!is_scalar($method)) {
throw new Exception('메소드 이름에 스칼라 값이 없습니다.');
}
if (is_array($params)) {
$params = 배열_값($params);
} 그 밖의 {
throw new Exception('매개변수는 배열로 제공되어야 합니다.');
}
if ($this->알림) {
$currentId = NULL;
} 그 밖의 {
$currentId = $this->id;
}
// 拼装成一个요청请求
$request = array( '메서드' => $method, 'params' => $params,'id' => $currentId);
$request = json_encode($request);
$this->debug && $this->debug.='***** 요청 *****'."n".$request."n".'***** 요청 끝 * ****'."nn";
$opts = 배열('http' => 배열(
'방법' => '포스트',
'헤더' => '콘텐츠 유형: 애플리케이션/json',
'내용' => $요청
));
// 关键几부
$context = stream_context_create($opts);
if ( $result = file_get_contents($this->url, false, $context)) {
$response = json_decode($result,true);
} 그 밖의 {
throw new Exception(''.$this->url에 연결할 수 없습니다);
}
// 输调试信息
if ($this->debug) {
echo nl2br(($this->debug));
}
// 检验응답信息
if (!$this->notification) {
//확인
if ($response['id'] != $currentId) {
throw new Exception('잘못된 응답 ID(요청 ID: '.$currentId.', 응답 ID: '.$response['id'].')');
}
if (!is_null($response['error'])) {
throw new Exception('요청 오류: '.$response['error']);
}
$response['result'];
} else {
true를 반환합니다.
}
}
}
?>
(三) 应용实例
(1) 服务端 server.php
(2)测试类文件,member.php
(3) 클라이언트 client.php
$url = 'http://localhost/rpc/server.php';
$myExample = 새로운 jsonRPCClient($url);
//고객전화
시도해보세요 {
$name = $myExample->getName();
$name 에코 ;
} 잡기(예외 $e) {
echo nl2br($e->getMessage()).'
'."n";
}