【PHP】XML-RPCを使ってサーバの機能を呼び出す

XML-RPCとはXMLを使った遠隔手順呼び出し(Remote Procedure Call)を行うためのプロトコル(取り決め)です。詳しくはWikipediaで。よく分からない人はここを読んだほうがいいです。

実際に試してみる方法ですが、Windows環境ならばXamppをインストールすればPEARのXML-RPCパッケージも同時にインストールされるので、手軽に試すことができます。

Linux環境の場合はPEARのXML-RPCパッケージがインストールしてあるか確認が必要です。

あとはここにあるサンプルコードを参考にすれば動作確認ができます。

ほとんど同じですが、私が書いたのも置いときます。クライアント側のソースにデバッグモードにするのと3秒でタイムアウトにする処理が入ってます。

●サーバ側(呼び出される側)のソース

<?php
require_once 'XML/RPC/Server.php';

$map = array("sample.sumAndDifference" => array("function" => "foo"));
$s = new XML_RPC_Server($map);

function foo ($params) {
    global $XML_RPC_erruser; // import user errcode value
    $p1 = $params->getParam(0);
    $p2 = $params->getParam(1);
    $v1 = $p1->scalarval();
    $v2 = $p2->scalarval();
    $value = new XML_RPC_Value($v1+$v2, "int");
    return new XML_RPC_Response($value);
}
?>

●クライアント側(呼び出し側)のソース

<html>
<head>
<title>XML-RPC PHP Demo</title>
</head>
<body>
<h1>XML-RPC PHP Demo</h1>
<textarea style="height:500px;width:500px;">
<?php
require_once 'XML/RPC.php';
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";

//クライアントの作成
$c = new XML_RPC_client( '/xmlrpc/xmlrpc_srv.php', 'localhost', 80 );
$c->setDebug(1);
//メッセージ作成
$params = array(new XML_RPC_Value( 5, 'int' ), new XML_RPC_Value( 3, 'int' ));
$message = new XML_RPC_Message('sample.sumAndDifference',$params);

//メッセージ送信
$response = $c->send($message, 3);

// Process the response.
if (!$response->faultCode()) {
    $v = $response->value();
    print "Value: ". $v->scalarval() ."<br>";
    print "The XML received:<blockquote>" . $response->serialize();
    print "</blockquote>";
}else{
    print "Fault Code:   " . $response->faultCode()   . "<br>";
    print "Fault Reason: " . $response->faultString() . "<br>";
}

?>
</textarea>
</body></html>

ちょっとはまったのは、クライアント側でサーバ側のリソースを指定するときに頭にスラッシュをつけないと、「400 Bad Request」で返ってくる。404ではないので、記述方法が違うのかとか、Apacheの設定が違うのかとか別の方に走ってしまった。

動作環境:Xampp 1.6.6a