更新pingその後

とりあえず、動くようになったんだけど・・・イマイチ、原因が定かではなかったりするがなんとかそれっぽい部分を攻略してみました。

XMLRPC for PHPが新しいのが9月に出ていたのでまずはこれをベースにすることにした。

さらに、その前段階で調べていくと、どうもPingサーバ様達はXMLRPCのStringのデータが[[CDATA ほにゃ ]]とか
になっているとエラーを返すっぽいぞ という現象にぶち当たったのだが・・・はたして本当にそうなのか?自信がない。
が、とりあえずそいつを取っ払うことにした。
さらになぜかほかのエラーも発生・・・Response周りのところでなぜか取得エラーが出る。
元のXMLRPCはNucleus(ココで使っているし)から持ってきたものなのなので、前述したように最新版にしてから考えるべしという基本的な荒業に入りました(笑)。

そういえば、本家のソースにはCDATAの設定でないんだよねぇ縲怐AあれはNucleus専用だったのか・・・さらに文字変換のルーチンが日本における1文字2バイトを超える場合には悪さするのでそれも取っ払った(いわゆる昔の手戻りみたいな修正)。
それを利用してなんとか、MODxからPingサーバへ無事Pingが飛んだ ということになりました。

が、実は飛べるんだけどプラグインのResponse部分でFaultCodeがエラーで返ってくる・・・という(謎)が未解決。
これはさっぱり原因がわからんでし・・・Responseの構造がXML_Parseでうまくとりきれないようにも見えるけど、実際ここのNucleusにも同じものをぶち込んでNP_SendPingもちょっくら改造してもエラーが操作履歴に出てこないのでそんなことはなさそう・・・
となると、MODxのプラグインが問題っぽいんだけど、その呼び出し部分はNP_SendPingと同じぐらいにシンプルなのでありえない・・・
となると・・XMLRPCのライブラリ側? ・・・・という堂々巡りに陥ったので、エラーをログに出さないようにしてとりあえずやめちゃいました。(蓋を開けなきゃ問題ないと)

ということで、以上の見解からするとNucleusの3.21以降だと更新Pingが正しくいってないつう可能性があるぞ ということになるんだけど・・・

結局、それが正しいのかよくわかってないので、もしNucleus使いの方でそんな風な感じがするという方が大勢いらっしゃれば、きっとそうなんだろうと思われる。

そうらしいという方の為に修正メモ

まず、XMLRPC for PHPをダウンロードしてくる。
一応、RDF周りの為にCDATAにも対応しておくべきかと思い、ソースを改造してどっちもできるようにしてみた。
その為の修正が以下にxmlrpcvalのクラス生成時のパラメタに$modeを追加
0ならば今まで通りにCDATAをつける、0でなければ付けないという仕組み

class xmlrpcval
{
var $me=array();
var $mytype=0;
var $mode=0;

function xmlrpcval($val=-1, $type=”,$mode=0)
{
global $xmlrpcTypes;
$this->me=array();
$this->mytype=0;
$this->mode = $mode;

 

モードによって切り替えている部分

 

function serializedata($typ, $val)
{
$rs=”;
global $xmlrpcTypes, $xmlrpcBase64, $xmlrpcString,$xmlrpc_defencoding,
$xmlrpcBoolean;
switch(@$xmlrpcTypes[$typ])
{
| 省略
case 1:
switch ($typ)
{
case $xmlrpcBase64:
$rs.=”<${typ}>” . base64_encode($val) . “</${typ}>”;
break;
case $xmlrpcBoolean:
$rs.=”<${typ}>” . ($val ? ‘1’ : ‘0’) . “</${typ}>”;
break;
case $xmlrpcString:
// G. Giunta 2005/2/13: do NOT use htmlentities, since
// it will produce named html entities, which are invalid xml
if (!$this->mode)
{    $rs.=”<${typ}><![CDATA[” . mb_convert_encoding($val,”UTF-8,”UTF-8,EUC-JP”). “]]></${typ}>”;
} else
{    $rs.=”<${typ}>”.mb_convert_encoding($val”UTF-8″,”UTF-8,EUC-JP”). “</${typ}>”;
}
break;

本来であれば、mb_convert_encodingの引数はそれぞれの環境に従った形で修正されているんだけど、面倒なのでどっちでもOKなように直接文字コードを入れた。
(もし、EUC-JP環境でおかしいようなら後ろの”UTF-8,EUC-JP”をEUC-JPにしてみるべし)

もう1箇所、mb_convert_encodingを使用する箇所があるので、これもEUC-JPなヒトは直しておくこと。

function serialize()
{
| 省略
<value><string>’ . mb_convert_encoding($this->errstr, “UTF-8″,”UTF-8,EUC-JP”) . ‘</string></value>

さらに今回の修正の為にNP_SendPingも修正する必要がある。

xmlrpcmsgの引数に、先ほど追加した$modeの部分に1を指定する。

function sendPing($pingurls) {
$b = new BLOG($this->myBlogId);
| 省略
$ping_info = new xmlrpcmsg(
‘weblogUpdates.ping’,
array(
new xmlrpcval($b->getName(), ‘string’,1),
new xmlrpcval($b->getURL(), ‘string’,1)
)

以上で正しく更新Pingが飛ぶはずである・・・一応、ココの実験してmyblog.jpとかblogpeopleなんかで確認してみたつもり・・・。
あとは、MODxプラグインそのものなんだが・・・公開しようかどうしようか迷い中・・・MODxに更新Pingは入れてもいいのかしらと

プッシュ通知を