<?php
/*
* require_onceでXML_RPC_Serverを読み込みます。
* これだけでXML_RPC_Message, XML_RPC_Responseも読み込めます。
*/
require_once('XML/RPC/Server.php');
/**
* 送信されたXML_RPCのデータ解析を行います。
* 引数で与えられる$msgはPHPのPEARパッケージのXML_RPC内に定義されている
* クラスで、pingデータとして送信されたものが既に分解された状態で収まっ
* ています。
* このクラス内からページタイトルやURLを取得して自分なりのpingデータ更新
* を行います。
* 処理を行った後はきちんとレスポンスをしなければなりませんが、これも
* XML_RPCパッケージ内に定義されているXML_RPC_VALUEとXML_RPC_Response
* にて行うようにします。
*
* XML_RPCの詳しい定義、PHPでの実装方法については、下記を参照してください。
* http://www.xmlrpc.com/weblogsCom
* http://revjim.net/comments/9500/
*
* @param XML_RPC_Message $msg XML_RPCデータクラス
* @return XML_RPC_Response XML_RPCのレスポンスクラス
*
*/
function weblogUpdates($msg)
{
/*
* pingデータは順番が決まっているみたいです。
* 必須データはタイトルとURLのみですので、これだけ解析できれば
* いいかと思います。
*
* 1番目 : ページタイトル (必須)
* 2番目 : ページURL (必須)
* 3番目 : 変更されたURL (オプション)
* 4番目 : ページカテゴリ (オプション)
*
*/
for ($i = 0; $i < $msg->getNumParams(); $i++) {
if ($i == 0) {
$title = $msg->getParam($i)->getval();
} else if ($i == 1) {
$url = $msg->getParam($i)->getval();
} else if ($i == 2) {
$change_url = $msg->getParam($i)->getval();
} else if ($i == 3) {
$category = $msg->getParam($i)->getval();
}
}
/*
* ここで取得したpingデータを処理します。
* 例えばデータベースへの更新や、ファイル出力など
*/
/*
* レスポンス内容はXML_RPCデータの構造体でなければなりませんので、
* 下記のように定義します。
* flerrorについては処理が成功したらbooleanで0、失敗したらbooleanで
* 1を返すようにします。
* messageについては処理が成功したらサンクスメッセージ、失敗したら
* 失敗した旨のメッセージにすれば適切かとおもいます。
* 下記の例では成功した場合の定義をしています。
*/
$value = new XML_RPC_Value(
array(
"flerror" => new XML_RPC_Value(0, "boolean"),
"message" => new XML_RPC_Value("Thanks for the ping.")),
"struct");
/*
* 上記でレスポンスメッセージを定義したら、その内容をXML_RPC_Response
* クラスで戻り値を生成します。下記のようにすれば大体大丈夫かと思われ
* ます。
*/
return new XML_RPC_Response($value);
}
/*
* pingデータを取得する関数定義をします。
* Weblogではpingデータを送信するフォーマットが決まっており、名称が
* 「weblogUpdates.ping」となっているみたいですので、この名前でリクエスト
* が送られてきた場合はこの関数を実行する、という定義を書きます。
*/
$map = array("weblogUpdates.ping" => array("function" => "weblogUpdates"));
/*
* 上記で定義した関数などをXML_RPC_Serverへ引数として渡してクラス生成を
* します。これだけでOKです。
* XML_RPC_ServerはPEARパッケージのXML_RPCが必要です。
*/
$server =& new XML_RPC_Server($map);
/*
* exit(0)は単にスクリプトをきちんと終了させるために書いてあります。
*/
exit(0);
?>