ホームページ  >  記事  >  バックエンド開発  >  PHP での XML-RPC の使用法の詳細な説明

PHP での XML-RPC の使用法の詳細な説明

WBOY
WBOYオリジナル
2016-06-20 13:01:001209ブラウズ

XML-RPCとは、Remote Procedure Callの略で、リモートマシン上のプロセス(メソッド)をローカルマシン上で呼び出す技術です。 「分散コンピューティング」は、個別のマシンの「相互運用性」を向上させるために発明されたテクノロジーです。

「データはプログラムである」という観点からすれば、RPCは何らかの通信手段を使って相互にデータ(情報)をやり取りすることに他ならないので、「高度な」通信手段でもありますが、この通信はこれは、「関数」として現れることが多く、交換する情報の本質を覆い隠すためです。
さまざまな RPC テクノロジの中で、最も有名なのは Sun の RPC だと思います。人気のあるネットワーク ファイル システム NFS は SUN RPC テクノロジに基づいています。
XMLRPC は、その名前が示すとおり (私は常にこのように物事を単純化するのが好きです。なぜなら、より良い名前の方が物事の本質を要約できることが多いからです。特定の名前が混乱を招く場合は、その名前をやめることをお勧めします。なぜなら、これを発明したのはこの人だからです。 (ほとんどの人は本質を知らないので、無駄な時間とエネルギーを費やす必要はありません。) XML 技術を応用した RPC です。では、XML とは何でしょうか?

XML も RPC と同様、eXtensible Markup Language の略称で、中国語でマークアップ言語を意味します。山括弧 (<>) で囲まれた言語です。 HTMLなど。 XML の拡張性は、XML が言語の形式のみを定義し、一般にタグとして知られるキーワードをあまり定義しないという事実にも反映されているため、ユーザーはタグの定義を自由に選択できます。その自由さと単純な文法規則により、さまざまなデータを表すために広く普及し、使用されています。 Lisp 言語 (「たくさんの」括弧として知られる言語) に慣れている学生は、XML が Lisp 言語に似ていると感じるかもしれません。違いは、XML が Lisp 言語の丸括弧 (()) の代わりに山括弧を使用することです。実際のところ、それらはすべて非常に似ており、非常に多くの言語が同等であるように見えますが、唯一の違いは言語を適用する人だけです。

XMLRPC では XML はどのような役割を果たしますか?

答えは「交換されるデータ形式」です。 Sun RPC では、呼び出し側によって渡されるデータはバイナリですが、XMLRPC では、データは XML 形式になります。では、なぜバイナリではなく XML を使用するのでしょうか?一方で、世の中にはC/C++などのコンパイル言語に加えて、Python、perl、 JavaScript など (最近の記事では、通常、メモリ自体を管理する必要がないため、これを「動的言語」とも呼んでいます)、一方で、リトル エンディアンとエンディアンの違いなど、オペレーティング システムの違いを分離するためのものです。ビッグエンディアン。さまざまな理由から、XMLRPC は情報の形式として中間言語である XML を選択し、各言語がそれを独自のネイティブ データ型に変換する責任を負います。さまざまな言語と互換性を持たせるために考案された中間言語として、CORBAインタフェースの定義に使用されるIDL(Interface Definition Language)もあります。

XML-RPC の詳細については、XMLRPC の仕様を公式 Web サイトで参照してください。XMLRPC 自体は非常に単純なので、信じられませんか?それでは、皆さんにも、加法的な XMLRPC の書き方を学んでいただくことにします。

サーバー側:

XMLRPC メッセージは標準の HTTP プロトコルを使用して送信されるため、サーバーも Apache 上で実行される php を使用して開発されており、必要な条件として、システム開発ライブラリに php 言語 xmlrpc をインストールする必要があります。多くの場合、php では XMLRPC のサポートが有効になっていないため、phpxmlrpc を選択しました。

ダウンロード後、その lib ディレクトリをコピーし、libphpxmlrpc という名前を付けます。以下に最初の XMLRPC 実装を記述します。 ファイル: xmlrpc_server.php


include ("libphpxmlrpc/xmlrpc.inc");
include ("libphpxmlrpc/xmlrpcs.inc");

if ($_SERVER['REQUEST_METHOD'] != 'POST')
exit(0);

$add_sig = array(array($xmlrpcString, $xmlrpcInt, $xmlrpcInt));
$add_doc = "Add the two integer together";

function add($params)
{
global $xmlrpcerruser;

$val = php_xmlrpc_decode($params);

$ret = $val[0] + $val[1];

return new xmlrpcresp(new xmlrpcval($ret, "int"));
}

$server = new xmlrpc_server(array(
"add" => array(
                "function" => "add",
                "signature" => $add_sig,
                "docstring" => $add_doc
        )));

?>

とても単純明快だと思いませんか?上記のコードを通じて、CPCS (コピー、貼り付け、変更、保存) メソッドを使用して、より多くの XMLRPC についての推論を確実に行うことができると思います。

クライアント:

プログラムが正しいかどうかをテストするには、クライアントを作成する必要があります。何を使用して作成すればよいでしょうか?あるいは、どちらを書くのがより便利ですか?ちょっと考えてみたところ、Python は比較的単純なはずです。簡単に Google で検索したところ、xmlrpc の実装が CPCS メソッドですぐに記述されたことがわかりました。 >

次のように:

ファイル: xmlrpc_client.py

#!/bin/env python
#!/bin/env python

from xmlrpclib import *
import sys

# xmlrpc add sample in python
server = Server("http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php");

try:
        retval = server.add(12, 13)
        print retval

except Error, v:
        print "Error", v
xmlrpclib インポートから *

インポートシステム

# xmlrpc Python でサンプルを追加
xiaosuo@gentux xmlrpc $ ./xmlrpc_client.py
25
server = Server("http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php"); 試してみてください: retval =server.add(12, 13) print retval エラーを除く、v: print "エラー"、v テーブル> 注: 私が開発したルート ディレクトリは /home/xiaosuo/xmlrpc/ なので、Web ページのディレクトリは当然、以下と同じ http://127.0.0.1/~xiaosuo/xmlrpc/ になります。 テスト: xiaosuo@gentux xmlrpc $ ./xmlrpc_client.py 25 テーブル>

わかりました!ではごきげんよう。
以下にいくつかの言語実装バージョンがあります。ご自身で分析し、CPCS メソッドを通じて使用方法を学習してください。
phpxmlrpc の php バージョンを使用します:


include ("libphpxmlrpc/xmlrpc.inc");
include ("libphpxmlrpc/xmlrpcs.inc");

if (isset($_POST['var1']) && isset($_POST['var2'])) {
$client = new xmlrpc_client("http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php");
$msg = new xmlrpcmsg("add", array(
new xmlrpcval($_POST['var1'], "int"),
new xmlrpcval($_POST['var2'], "int")));
$retval = &$client->send($msg);
        if ($retval->faultCode()) {
                print_r("An error occurred: ");
                print_r("Code: " . htmlspecialchars($retval->faultCode())
                        . " Reason: " . htmlspecialchars($retval->faultString()));
        } else {
                $sum = $retval->value()->scalarval();
        }
}

?>

"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">


xmlrpc add sample in php


>
/>
+
/>

/>


include ("libphpxmlrpc/xmlrpc.inc");

include ("libphpxmlrpc/xmlrpcs.inc");
#!/bin/bash

xmlrpc http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php add i/12 i/13
if (isset($_POST['var1']) && isset($_POST['var2'])) { $client = new xmlrpc_client("http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php"); $msg = new xmlrpcmsg("add", array( new xmlrpcval($_POST['var1'], "int"), new xmlrpcval($_POST['var2'], "int"))); $retval = &$client->send($msg); If ($retval->faultCode()) { print_r("エラーが発生しました: "); print_r("コード: " . t;faultCode()) " 理由: " .htmlspecialchars($retval->faultString())); } else { $sum = $retval->value()->scalarval(); } } ?> <頭> xmlrpc php にサンプルを追加 <フォームメソッド="POST" + テーブル> xmlrpc-c の xmlrpc コマンドのシェル バージョンを使用します: #!/bin/bash xmlrpc http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php add i/12 i/13 テーブル>

C 言語バージョンの xmlrpc-c を使用します:


/*
 * Compile method:
 * gcc -o xmlrpc_client.out `xmlrpc-c-config --libs --cflags` xmlrpc_client.c -lxmlrpc_client
 */
#include
#include
#include
#include

#define NAME "XML-RPC C Test Client"
#define VERSION "1.0"

#define die_if_fault_occurred(x) /
        do { /
                if ((x)->fault_occurred) /
                abort(); /
        } while(0)

int main(int const argc, const char ** const argv)
{
        xmlrpc_env env;
        xmlrpc_value * resultP;
        int sum;
        char *const url = "http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php";
        char *const methodName = "add";

        /* Initialize our error-handling environment. */
        xmlrpc_env_init(&env);

        /* Start up our XML-RPC client library. */
        xmlrpc_client_init2(&env, XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION, NULL, 0);
        die_if_fault_occurred(&env);

        /* Make the remote procedure call */
        resultP = xmlrpc_client_call(&env, url, methodName,
                        "(ii)", (xmlrpc_int32) 12, (xmlrpc_int32) 13);
        die_if_fault_occurred(&env);

        /* Get our state name and print it out. */
        xmlrpc_parse_value(&env, resultP, "i", &sum);
        die_if_fault_occurred(&env);
        printf("The sum  is %d/n", sum);

        /* Dispose of our result value. */
        xmlrpc_DECREF(resultP);

        /* Clean up our error-handling environment. */
        xmlrpc_env_clean(&env);

        /* Shutdown our XML-RPC client library. */
        xmlrpc_client_cleanup();

        return 0;
}

Frontier ライブラリを使用する Perl バージョン:

#!/bin/env perl
#

use strict;
use warnings;
use Frontier::Client;

my $server = Frontier::Client->new(
        url => "http://127.0.0.1/~xiaosuo/xmlrpc/xmlrpc_server.php");

my $sum = $server->call("add", (12, 13));

print $sum . "/n";


XMLRPC のサポート範囲を嘆き始めていませんか? 実際、さらに多くの言語サポートについては、XMLRPC の公式 Web サイトで実装リストを確認してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。