Yahooブログ検索のping受信機能の不具合

2007/08/30 | XML

以前、お仕事でお受けした案件で出た問題が解決したのでメモ。
更新ping(weblogUpdates.ping)の送信プログラム作成の依頼をいただいたので、xmlrpc.incを使ってスクリプトを書いてみた。基本的にほぼ全てのpingサーバにおいて、ping送信時のレスポンスを正しく受け取ることができた。しかし日本のyahooだけは「No data received from server.」なぁんていうレスポンスを返してくる。理由がワカラナイ・・・。
納品時は「yahooだけだから」ということで原因探求を免除していただいたのだが、やはり気になる。少し時間をとって調査をしてみた。調査方法としてはfsockopenで最低限の内容で生通信して成功することを確認し、成功結果と失敗結果を比較する方法で調査をおこなった。
結論として、xmlのデータ構成がyahooには気に入らなかったらしい。

本来pingデータはxmlでpostされてくるわけだが、そのxmlを構成している要素は基本2個、拡張2個の合計4個の要素で構成される。もちろん拡張2個はなくても問題ない(基本の2個を押さえていればいいはず)。4つの要素はそれぞれ以下のような感じ。
 ○サイト名
 ○サイトURL
 ○更新のあった(新しく追加された)ページのURL
 ○カテゴリ

yahooが気に入らなかったのは4つの要素が送られてきた点。つまり「拡張2個が余計だ」ということらしい。4つの要素で構成されたxmlを投げた場合はエラーとなり、基本の2つの要素でxmlを構成した場合は、正常なレスポンスが返された。70ほどのpingサーバを試してみたが、「No data …」のエラーは日本のYahooだけ(アメリカYahooでも問題ないのに・・・)。

まぁ、何はともあれすっきりした。
結局最近のpingサーバは、pingを受信した後、rssを収集して回るようになっているので、そもそもpingの拡張要素自体に意味がないのかもしれない。

それにしても・・・Yahoo、こういうのって最低限対応しておくべきではない?。

xmlrpc.incの不具合

2007/08/29 | XML

ブログを操作したり、pingの送受信をしたりする際に使用しているxmlrpc( http://phpxmlrpc.sourceforge.net/)で「不都合」と思われる箇所を発見した。
今までいろいろなブログに対してテストをおこなっていた。MTなどでは正常に送信できているのだが、例えば「gooブログ」で投稿すると???と「?」の羅列になってしまっていた。MTで正しく投稿できているのだから、「gooブログのほうがおかしい」と決め込んでいたのだが、実はxmlrpc.incがまずかった。

xmlrpc.inc読み込み時に以下のように記述する必要があることは前にも書いた。
$GLOBALS[‘xmlrpc_internalencoding’]=’UTF-8′;
しかし、これだけでは「準備が足らない」ということだ。具体的にはxmlrpc.incのxmlrpc_clientクラス中で定義されている「request_charset_encoding」という変数に値をセットしてやらなければならない(デフォルトでは空文字列が与えられている)。具体的には以下のように記述。

require_once(‘xmlrpc.inc’);
$GLOBALS[‘xmlrpc_internalencoding’]=’UTF-8′;
$obj=new xmlrpc_client($path,$host,$port);
$obj->request_charset_encoding=’UTF-8′;

xmlrpc.inc内にはクラスの定義だけでなく、簡単な判別ルーチンや独自で使用する関数も定義されている。上記の文字コード設定は、実際にはクラスの外で定義された関数を仲介してクラス内で処理されている。しかし設定箇所がないので、何もしなければ希望の処理パターンを選べないのだ。

本来なら、値をセットするような関数を用意しておくべきなのだが、それも見当たらない。仕方無しに「直接外部から変数の値を書き換えている」という次第だ。

バグなのか、それともxmlrpcを記述する際の正しい書き方が別に存在するのか、理由は不明。でもこれでほとんどのブログに対して記事投稿ができるようになりそうだ。

simplepie.inc ・・・ すごく仕様かわってたりする

2007/08/27 | XML

RSSをパースするためのライブラリにはいくつかある。有名どころはmagpieとsimplepieだと思う。自分はsimplepieを使っている。
ここ最近横着をして最新版を使っていなかったのだが、今日久しぶりに最新版のsimplepie.incをダウンロードして使ってみた・・・動かない。こともあろうに、ことごとく「Call to undefined method」が出る。なぜ?。

ソースを確認してみたら、実際問題、以前使用していたメソッドがなかった。ということで必要最小限のサンプルを書いてみて動作することを確認した。
困ってしまっている人がいたら以下のサンプルをどうぞ。

$feed=new SimplePie;
$feed->set_cache_location(‘./cache/’);
$feed->set_feed_url($target);
$feed->init();
$feedItems=$feed->get_items();
$entries=array();
foreach($feedItems as $item){
  $entry=array();
  $entry[‘title’]=$item->get_title();
  $entry[‘description’]=$item->get_description();
  $entry[‘date’]=$item->get_date(“U”);
  $entry[‘link’]=$item->get_link();
  $entries[]=$entry;
}

fsockopenは時間がかかる?

不思議?というか、わからない現象に出くわして、ちょっと悩んでいる。
外部URLに接続してコンテンツを持ってくる(要はRESTでxmlを取得したりする)時には、いろいろな取得方法がある。
(1) fopenとかfile_get_contentsで取得
 引数にURLを直接渡す方法で一番簡単だが、データを取りこぼすことがある。
(2) curlで取得
 インストール時のコンパイルオプションによっては使えないことがある。
(3) fsockopenで直接HTTPを話して取得
 直接HTTPを話すスクリプトを用意する必要がある。

PEARのHTTP_Requestを使うという選択肢もあるが、これも結局は内部で上記を呼び出している(と思う)ので同じことだ。
上記で一番確実な方法は(3)のfsockopenを使う方法だ。PHPの標準関数でできるし、取りこぼしもないので、これを使うべきだ(と思う)。しかし、ちょっと困ったことになってしまった。fsockopenでデータを取得するのに時間がかかるのだ。
fsockopenの手順としては、以下のような感じ。
(1) fsockopenで相手サーバに接続
(2) fputでリクエストを送信
(3) fgetsでレスポンスを受信

しかし(1)で異常に時間がかかってしまうのだ。時間にして20秒くらいかかる。これがなぜだかわからない・・・。
ちなみに当該URLを、ブラウザ上で開くと数秒で表示される。それにfile_get_contentsで取得しても、やはり数秒で結果を返してくる。

ん〜〜〜。

いろいろ調べてみたが理由がわからなかった。レスポンスを受信するのに時間がかかるのであれば、相手サーバの処理時間とか、通信速度の問題か、とも思うのだが、fsockopenで時間がかかるのが不思議だ。fsockopenで時間がかかるのなら、file_get_contentsでも時間がかかってしまいそうなのだが、あいにくこちらは時間がかからない。

どなたか、思い当たるところがあったら教えていただきたい。
どうぞよろしくお願いします。

PEARで依存関係の少ないライブラリ

2007/08/24 | その他PEAR全般

最近Xoopsでのモジュール開発やcakePHPでの開発が多いのだが、いずれもPEARライブラリとの相性という点ではそれほどいいわけではない。Xoopsはモジュール単位で開発することが多いので、別途PEARのライブラリを用意しておく、というのはいただけない。モジュールに同梱できる程度にとどめておくべきだ。かといって大量のPEARファイル群をモジュールに同梱するというのは考え物だ。ファイルが多いとそれだけコードが読みにくくなるので、PEARのように複雑に依存関係で絡み合っているようなものはいれたくない、というのが心情だ。
cakePHPはいちおう基本コンセプトとして「PEARなどの外部ライブラリを使用することなく・・・」と謳っているので、なんとなく気分的に使いたくないのだ。
とは言ってもPEARは有用なツールであるので捨てがたい。ということで依存関係がほとんどないようなものに限定して、それらの開発で使用することにしている。
一番手放せないのはPager。ページング処理ではもう手放せない。Pagerは本体(Pager.php)とその配下のディレクトリ一つ(ファイル数個)を丸ごとコピーすれば事足りる。
Cache_Liteもシンプルですばらしい。基本的に本体(Lite.php)だけあれば動作する。ただしエラー処理ルーチンとして、エラーが発生した場合にPEARのエラーオブジェクトを返すよう実装されているので、extendsしたクラスを作成し、その部分だけfalseを返すよう書き換えてしまえばいい。
この二つはシンプルで、非常にすばらしいライブラリだ。

本当はHTML_QuickFormを使いたいのだが、こちらは少し状況が変わってくる。ファイル数も多くなるし、PEAR内での依存関係も少しある。それにXoopsで使用する場合は、Xoopsで用意されたフォーム生成クラスとバッティングしてしまっているということで、どうもためらってしまうのだ。便利だからいいじゃん、って思えるのだが・・・、どこかで一線を越えてチャレンジしてみようと思う。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net