導入

導入 –

Description

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();

?>
XML_RPC2 (Previous) クライアント側 (Next)
Last updated: Wed, 01 Oct 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: simon nuttall

// The package uses @dl() to load modules that might not exist.
// That function is deprecated in PHP5.3.
// Define it if it doesn't already exist before calling any XMPRPC methods:
if(!function_exists('dl')) {
function dl($ignore) {return false;}
}

// Also the example might be a little clearer if the key bit is structured like this:

$url = 'http://pear.php.net/xmlrpc.php';
$function = 'echoecho';
$arg = 'XML_RPC2';
$client = XML_RPC2_Client::create($url, $options);

try {
$result = $client->{$function}($arg);
}