XML_RPC2 は、XMLRPC プロトコルを "PHP5 限定" で実装したものです。 このパッケージは、クライアント側およびサーバ側のプロトコルを提供します。 その両方について、最適化されたキャッシュが使用可能です。
クライアントライブラリとしての XML_RPC2 は、 サーバがエクスポートしているメソッドを公開するプロキシクラスを作成することができます。 これにより、非常に簡単かつ自然な方法で XMLRPC のメソッドをコールできるようになります。 XML_RPC2 をクライアント側で使用する標準的な方法は、 Python 言語でのやりかたと似ており、次のようになります。
XML_RCP2_Client オブジェクトを、サーバの情報を引数として作成します。
標準的な方法で、このオブジェクトのメソッドをコールします。
メソッドコールは XMLRPC 形式に変換され、サーバに送信されます。 その応答内容は PHP のネイティブ型に変換され、 変換された内容をメソッドコールの返り値として取得します (この処理は、すべてライブラリ内で透過的に行われます)。
サーバライブラリとしての XML_RPC2 は、 クラスやインスタンスのメソッドを公開することができます。 メソッドはシームレスに公開でき、 ローカルメソッドも、リモートからコールできるプロシージャに自動的に変換されます。 メソッドのシグネチャは、自動的に検出され、チェックされます。 これは、リフレクション API および PHPDOC のコメントを使用します。 XMLRPC がエクスポートするメソッドについてのドキュメントは動的に作成され、 サーバの URL に (単純な HTTP GET で) アクセスすると利用できるようになります。
これらの両方について、Cache_Lite による最適化されたキャッシュが設定可能です。 これは、公開する XMLRPC サーバなどでは特に有用です。
XML_RCP2 は、PHP5 および CURL 拡張モジュールを必要とします。 次のバージョンでは CURL の依存性をなくしたいと考えており、 そのために HTTP_Request が PHP5 の E_STRICT に対応した PEAR モジュールになるのを待っています。
統合されたキャッシュを使用したい場合は、PEAR モジュール Cache_Lite が必要です。しかしこれはもちろんオプションの依存性となります。
XML_RPC2 は、XMLRPC のエンコード/デコードに二種類のバックエンドを使用することができます。
XMLRPCEXT。もちろん、使用するには PHP 拡張モジュールが必要です (お勧めの方法ですが、さらなる依存性が発生します)。
PHP。これは XMLRPCEXT 拡張モジュールを必要としません (完全に PHP だけで処理しますが、遅くなります)。
XMLRPC で pear.php.net の XMLRPC サーバをコールしてみましょう。
<?php
require_once 'XML/RPC2/Client.php';
$options = array(
'prefix' => 'package.'
);
// XML_RPC2_Client オブジェクトを作成しますt (バックエンドを指定していないので、
// もし使用可能なら XMLRPCEXT を使用します (これが使用できなければ PHP を使用します))
$client = XML_RPC2_Client::create('http://pear.php.net/xmlrpc.php', $options);
try {
// $options 配列でプレフィックスを設定したので、
// package.info() メソッドを単一の引数 (文字列 'XML_RPC2') でコールできます
$result = $client->info('XML_RPC2');
// $result は PHP の型になっています (XMLRPC のデコードは不要で、すでにデコード済みです)
print_r($result);
} catch (XML_RPC2_FaultException $e) {
// XMLRPC サーバが XMLRPC のエラーを返しました
die('Exception #' . $e->getFaultCode() . ' : ' . $e->getFaultString());
} catch (Exception $e) {
// その他のエラー (HTTP あるいはネットワークの問題など...)
die('Exception : ' . $e->getMessage());
}
?>
XMLRPC で "echo サーバ" を作ってみましょう。
<?php
require_once 'XML/RPC2/Server.php';
// パブリックな静的メソッドを持つクラスを定義しましょう。
// PHPDOC コメントは非常に重要となります。というのも、
// このコメントを使用してシグネチャの自動チェックが行われるからです。
class EchoServer {
/**
* 受け取ったメッセージをそのまま返します
*
* @param string Message
* @return string The echo
*/
public static function echoecho($string) {
return $string;
}
}
$options = array(
'prefix' => 'test.' // サーバ用に、一種の "名前空間" を設定します
);
// Echo クラスを使用してサーバオブジェクトを作成しましょう
$server = XML_RPC2_Server::create('EchoServer', $options);
$server->handleCall();
?>
サーバの URL に対して単純に HTTP GET を行うと、echoecho 関数についての HTML ドキュメントを自動的に取得することができます。XMLRPC クライアントから 同じ URL に対して "test.echoecho()" メソッド (ひとつの引数を指定します) をリクエストすると、引数に指定した内容をレスポンスとして受け取ります。 別のメソッドをコールしたり引数の数を間違えたりすると、エラーとなります (メソッドのシグネチャのチェックが自動的に行われるからです)。
キャッシュ処理は完全に透過的に行われるので、 これは、標準のクライアント側の使用方法とほとんど同じものになります。
<?php
require_once 'XML/RPC2/CachedClient.php';
$options = array(
'prefix' => 'package.',
'cacheDebug' => false, // cacheDebug を true に設定することで、簡単に
// キャッシュの使用状況を取得する (あるいはしない) ことができます
'cacheOptions' => array(
'cacheDir' => '/tmp/',
'lifetime' => 3600, // ここで指定した時間のあいだ、ローカルキャッシュが使用されます
'cacheByDefault' => true // すべてのメソッドコールをキャッシュします
// (もっと厳密に定義することもできます)
)
);
// XML_RPC2_CachedClient オブジェクトを作成します (XML_RPC2_Client と同じ構文です)
$client = XML_RPC2_CachedClient::create('http://pear.php.net/xmlrpc.php', $options);
try {
// 最初のコールではキャッシュは使用されません
$result = $client->info('XML_RPC2');
print_r($result);
// 二回目のコールではキャッシュが (透過的に) 使用され、
// サーバへの HTTP リクエストは送信されません
$result = $client->info('XML_RPC2');
print_r($result);
} catch (XML_RPC2_FaultException $e) {
// XMLRPC サーバが XMLRPC のエラーを返しました
die('Exception #' . $e->getFaultCode() . ' : ' . $e->getFaultString());
} catch (Exception $e) {
// その他のエラー (HTTP あるいはネットワークの問題など...)
die('Exception : ' . $e->getMessage());
}
?>
キャッシュ処理は完全に透過的に行われるので、 これは、標準のサーバ側の使用方法とほとんど同じものになります。
<?php
require_once 'XML/RPC2/CachedServer.php';
// パブリックな静的メソッドを持つクラスを定義しましょう。
// PHPDOC コメントは非常に重要となります。というのも、
// このコメントを使用してシグネチャの自動チェックが行われるからです。
// 重要 : PHPDOC の @xmlrpc.caching タグで、メソッドのキャッシュを
// 定義していることに注意しましょう
class EchoServer {
/**
* 受け取ったメッセージをそのまま返します
*
* @param string Message
* @return string The echo
* @xmlrpc.caching true
*/
public static function echoecho($string) {
return $string;
}
}
$options = array(
'prefix' => 'test..',
'cacheDebug' => false, // cacheDebug を true に設定することで、簡単に
// キャッシュの使用状況を取得する (あるいはしない) ことができます
'cacheOptions' => array(
'cacheDir' => '/tmp/',
'lifetime' => 3600,
'cacheByDefault' => false // デフォルトではキャッシュしません
// (@xmlrpc.caching true のメソッドだけをキャッシュします)
)
);
$server = XML_RPC2_CachedServer::create('EchoServer', $options);
$server->handleCall();
?>