Tech Racho エンジニアの「?」を「!」に。
  • 開発

PHPでXML-RPCを使うとDecoded ResultがNULLになる問題の解決方法

PHPでXML-RPCを使った記録です。
PEAR::XML_RPC2を使うことにしました。PHP5専用で使いやすそうです。

  • PHP5以上
  • cURLのエクステンション

が必須です。

クライアント側では、

//クライアント側のコード
require_once './XML/RPC2/Client.php';
$options = array('debug' => true);
$client = XML_RPC2_Client::create('//www.bpsinc.jp/xmlrpc.php', $options); //URLはダミー
try {
    $result = $client->Version(); //関数名はサーバ側で定義したもの
    print_r($result);
} catch (XML_RPC2_FaultException $e) {
    var_dump($e);
} catch (Exception $e) {
    var_dump($e);
}

のように使えます。

しかし、これだとなぜか結果が全部NULLになることがあります。
debugメッセージを見ると、Server Responseは正常なのに、Decoded ResultがNULLになっているように見えます。

解決

この問題、Server側かHttpRequestの実装の問題だと思うのですが、Server ResponseのBodyの最初に改行が入っているのが原因でした。

\n<?xml version="1.0"?><methodResponse> …

PEAR/XML/RPC2/Backend/Xmlrpcext/Client.php の112行目付近で、

$result = xmlrpc_decode($body, $this->encoding);

となっているところを、

$result = xmlrpc_decode(trim($body), $this->encoding);

とすれば直ります。(マルチバイト対応のtrimを書いた方が良いかもしれません)

※XMLRPCEXT拡張モジュールが入っていない場合は、PEAR/XML/RPC2/Backend/PHP/Client.phpになります。

ライブラリを書き換えるのは強引ですが、xmlrpc_decode関数自体がEXPERIMENTALのままですし、あとはHttpRequestやサーバ側を変更しなければ行けないので、スマートな解決方法は思いつきません。

とりあえずresultがnullになる問題は回避できました。

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。