INFOINFO
MAILMAIL

2010年 6月15日(火)

* PHPのXML-RPC対応で一苦労    [  Movable Type | PHP  ]

 Ubuntuに乗り換えたサーバはその後も順調に稼働していて、日々ログのチェックなんかはしているものの、とくに気なる部分はなし。10.04はリリースされて1カ月半だけど、細かな修正はときどき入っているようで、カーネルも2回ほどアップグレードされたかな、たしか。まぁ、そのあたりもパッケージの自動更新になってるので、とくに手間もかからないし(カーネルのアップデートの際だけ、再起動が必要になるけども)。

 で、ほとんどが最新のモジュールになっている中で、唯一、MTだけが古いバージョンで運用しているので、ちょいと最新版がどんなものか、チェックを兼ねてテスト環境にインストールしてみたわけですよ。
 とりあえずMT本体は、今ウチで稼働しているのがMT3.38で、現在の最新版はMT5.02なので、2つもメジャーバージョンが上がってるわけで、なんというか、ずいぶんと世界が変わってたって感じで…(^^;)。ま、MT本体に関しては別エントリで書く予定。

 んで、いろいろテストしてる過程で、自作して利用しているXML-RPC APIを使ったフォームでエントリを登録すると文字化けしちゃうことが判明。あちこちの設定とかいじってみてもダメだし、同じフォームでMT3/MT4では問題ないのに、MT5だけで問題が出たりして、さらにその部分をMT3/4相当にデグレードすると問題が解決するので、てっきりMT5側の問題じゃないかと思ってサポートの人とかにコンタクトとってみたりもしたんだけども、あっちでは再現しないと…。

 その後も、いろいろやってるうちに、もしかしてと思って、フォームをperlで書き直して投稿してみたら、これが何の問題もなく動作するし…。結局、あちこちいろいろ調べて、原因がPEARのXML-RPC2にあるってことが判明。
 一応、バグってる場所も特定して、その情報をググってたら、まったく同じ問題にぶち当たってる人を発見してみたり→「PEARのXML_RPC2が文字化けする件 - それ図解で。・・・tohokuaikiのチラシの裏」。
 うぅぅぅ、「XML RPC2 文字化け」で検索してればすぐに見つかってたのか(^^;)。

 そんなわけで、PEARのXML-RPC2の問題とわかったわけだけど、拡張モジュールにパッチ当てて使うのはあんまり嬉しくない。念のため、旧版のPEARのXML-RPCではうまく動くんだけど、こっちはすでに開発も止まってるやで今さら使いたくないし、こりゃあperlで書きかえるしかないのか、と思ってたんだけど、良く考えたらPHP単体でもXML-RPCはサポートしてるんだよねぇ。
 PEARのXML-RPCにしてもXML-RPC2にしても、単体のユニットが使いにくいから、それを使いやすくしているだけだからね。ってことで、そのへんの情報をゴリゴリとググっったりしつつ、自前のユニットをでっちあげてテストしてみたら、ようやく文字化けもなくなりましたよ。あぁ、良かった。
 しかし、まぁ、拡張モジュールとしてPEARで配布されているモジュールにバグがあるとは思わんかったなぁ(^^;)。

 ちなみに、XML-RPC2だと

require_once("XML/RPC2/Client.php");
$test = XML_RPC2_Client::create('http://localhost/xmltest/xmlrpc_server.cgi', array('prefix' => 'test.', 'encoding' => 'utf-8'));
$result = $test->module('あいうえお');

の3行で書けるものが、拡張モジュールを使わないと、

$xml = xmlrpc_encode_request('test.module', array('あいうえお'), array('encoding' => 'UTF-8', 'escaping'=>'markup'));
$opts = array();
$opts['method'] = "POST";
$opts['content'] = $xml;
$header = array('Content-type: text/xml', 'Content-length: '.strlen($xml));
$opts['header'] = join("\r\n", $header);
$context = array('http' => $opts);
$ctx = stream_context_create($context);
ini_set('track_errors', true);
$result = @file_get_contents('http://localhost/xmltest/xmlrpc_server.cgi', false, $ctx);

こんくらい書かないと実現できなかったりするので面倒くさいっていうか、わかりにくいっていうか。ま、でも、ちゃんと動かなきゃ意味ないんで仕方ないんだけどね(^^;)。

Posted by “Lupin” on 2010/06/15 22:21:20
コメント
コメントはありません。
●コメント投稿
このエントリーにはコメント投稿できません。