ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアルで実装された単純な json rpc フレームワークの例

php_PHP チュートリアルで実装された単純な json rpc フレームワークの例

WBOY
WBOYオリジナル
2016-07-13 09:59:10881ブラウズ

phpで実装された簡単なjson rpcフレームワークの例 この記事では、phpで実装された簡単なjson rpcフレームワークの例を主に紹介します。この記事では、RPCサーバーとクライアントのコードとアプリケーションの例を紹介します。

json rpc は、メッセージ形式として json を使用するリモート呼び出しサービスです。これは、異なるオペレーティング システムや異なる環境で実行されるプログラムがインターネット ベースのプロセス呼び出しを実装できるようにする一連の仕様と一連の実装です。このリモート プロシージャ コールでは、送信プロトコルとして http を使用することも、その他の送信プロトコルを使用することもできます。送信されるコンテンツは、json メッセージ本体です。
以下では、PHP に基づいた RPC フレームワークのセットをコーディングします。このフレームワークには、RPC サーバーとアプリケーション クライアントが含まれます。

(1) PHPサーバー RPCserver jsonRPCServer.php

コードは次のとおりです:

クラス jsonRPCServer {

/**

*いくつかのリクエストパラメータがバインドされたリクエストクラスを処理します
* @param オブジェクト $object
* @return boolean
*/
パブリック静的関数ハンドル($object) {
// rpc json リクエストかどうかを判断します
if ($_SERVER['REQUEST_METHOD'] != 'POST' || empty($_SERVER['CONTENT_TYPE'])
||$_SERVER['CONTENT_TYPE'] != 'アプリケーション/json') {
false を返します;
}
// 入力データを読み込みます
$request = json_decode(file_get_contents('php://input'),true);
//リクエストクラスのインターフェースを実行
試してみてください{
if ($result = @call_user_func_array(array($object,$request['method']),$request['params'])) {
$response = array ( 'id'=> $request['id'],'result'=> $result,'error'=> NULL );
} その他 {
$response = array ( 'id'=> $request['id'], 'result'=> NULL,
'エラー' => '不明なメソッドまたは不正なパラメータ' );}
} catch (例外 $e) {
$response = array ('id' => $request['id'],'result' => NULL, 'error' =>$e->getMessage());
}
//json形式で出力
if (!empty($request['id'])) { // 通知は応答を必要としません
header('content-type: text/javascript');
echo json_encode($response);
}
true を返します;
}
}



(2) RPCクライアント、jsonRPCClient.php

コードをコピーします。コードは次のとおりです:

/*

*/
クラス jsonRPCClient {


プライベート $デバッグ;
プライベート $url;

// リクエストID

プライベート $id;

プライベート $notification = false;
/**
* @param $url
* @param bool $debug
*/
パブリック関数 __construct($url,$debug = false) {
// サーバーURL
$this->url = $url;
// プロキシ
空($proxy) ? $this->proxy = '' : $this->proxy = $proxy;
//デバッグ状態
empty($debug) ? $this->debug = false : $this->debug = true;
// メッセージID
$this->id = 1;
}

/**
*
* @param boolean $notification

*/

パブリック関数 setRPCNotification($notification) {
空($notification) ? $this->notification = false : $this->notification = true;
}

/**
* @param $method
* @param $params

* @return bool

* @throws 例外
*/
パブリック関数 __call($method,$params) {
// リクエスト情報を確認する
if (!is_scalar($method)) {
throw new Exception('メソッド名にスカラー値がありません');
}
if (is_array($params)) {
$params = array_values($params);
} その他 {
throw new Exception('パラメータは配列として指定する必要があります');
}

if ($this->通知) {
$currentId = NULL;
} その他 {

$currentId = $this->id;

}

// 拼装成一个依頼请求
$request = array( 'method' => $method, 'params' => $params,'id' => $currentId);
$request = json_encode($request);
$this->debug && $this->debug.='***** リクエスト *****'."n".$request."n".'***** リクエストの終了 * ****'."ん";
$opts = 配列 ('http' => 配列 (
'メソッド' => 「投稿」、
'ヘッダー' => 'コンテンツタイプ: application/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']);
}
return $response['result'];

} 他 {
true を返します;
}
}
}
?>

(三) 应用实例
(1)服务端server.php

代码如下:


require_once 'jsonRPCServer.php';

代码如下:


// メンバーは测试类
'member.php' が必要です;
// 服务端调用
$myExample = 新しいメンバー();
// 注入实例
jsonRPCServer::handle($myExample)
または「リクエストなし」と出力します;
?>

(2)测试类文件,member.php

代码如下:


クラスメンバー{
パブリック関数 getName(){
'こんにちは単語' を返します。 // 戻り文字串
}
}

(3)客户端 client.php

代码如下:


require_once 'jsonRPCClient.php';

$url = 'http://localhost/rpc/server.php';
$myExample = 新しい jsonRPCClient($url);

// 客户端调用
試してみてください{
$name = $myExample->getName();
$name をエコーし​​ます ;
} catch (例外 $e) {
echo nl2br($e->getMessage()).'
'."n";
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/976531.html技術記事 php の 1 つの简单json rpc アーキテクチャの例 この項の文章は主に介在しています php の 1 つの简 单json rpc アーキテクチャの例、本文に記載されている RPC サービス端末とゲスト端末代コードおよびアプリケーションの例...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。