PHP・PEARでXMLを処理する
Amazonでアフィリエイトをしているのですが、Amazon.co.jpからメールが先日届きました。ECS 4.0に移行する案内メールは何度か送っているが、まだのようだから連絡してくれたとのことです。ECS 3.0は3月末で終了するという。ああ、すっかり忘れていたか、メールを見落としていました。
慌てて、ECS4.0でのXMLへのアクセス方法を調べてPHPプログラムを作り直してみました。ところが、なかなかうまくいきません。ECS 3.0の時は、xml_parse_into_struct関数を使ってやっていたのですが、Amazonのデータには、例えばある商品には「Availability」が設定されていても、設定されていない商品(=在庫が無い商品)がありますので、単純な配列の要素番号でのアクセスはバグります。Amazon Web Serviceでの開発を始めた数年前の時は、このような異常な?(というより、技量の低いプログラマーには不都合な)データは少なかったように思うのですが(そのようなデータがあった場合には、その都度、対処療法で対処していました。)、今回、ECS4.0用にいざ書き換えとうとして、いろいろ調べてみると、そのようなデータが非常に多いことに気づかされました。空データであれば、XMLデータの中に最初から入っていないようです。転送量を考えても、当然の仕様かもしれません。
xml_parse_into_struct関数の使い方が間違っている可能性もありますが、もはや対処療法では不可能ぽいので、別の方法を探ってみることにしました。PHP5ならSimpleXML関数が使えますが、私が使っているレンタルサーバはPHP4なので、使えません。そこで、PEAR(http://pear.php.net/package/XML_Serializer )を使ってみることにしました。私のレンタルサーバにもPEARがインストールされていることは分かっていたからです。
まず、XML_Serializerをダウンロードして、ローカルのPEARフォルダーの中の「XML」フォルダーにUnserializer.phpとSerializer.phpをコピーして、ローカルでのテストは成功しました。ところが、同じように、「XML」という名称のディレクトリーを公開サーバ上に作成し、そこにUnserializer.phpとSerializer.phpをアップロードしてみたのですが、「Fatal error: Call to undefined method: xml_parser->sethandlerobj() in /usr/home/*******/public_html/XML/Unserializer.php on line 852」のようなエラーが出てダメです。
もしかして、わざわざ、Unserializer.phpとSerializer.phpをアップしなくても、既に同パッケージはインストールされていて、使えるようになっているのかなと思って、ためしに両ファイルを削除してみると、今度は、「require_once("XML/Unserializer.php");」のところで、「main(XML/Unserializer.php) [function.main]: failed to open stream: No such file or directory
Fatal error: main() [function.require]: Failed opening required 'XML/Unserializer.php' (include_path='.:/usr/local/lib/php') in /usr/home/*******/public_html/test.php on line 2」となり、やっぱりダメです。サーバ事業者に連絡してXML_Serializerをインストールしてもらうか、自分のユーザー領域にコピーして使う(もちろん、sethandlerobjのエラーを解消しなければなりません。)しかないようです。
では、何でsethandlerobjのところでエラーになるのかなと思ってGoogleで調べてみたところ、原因はすぐに分かりました。
●undefined function: sethandlerobj() (Nega Diary)
http://www.ironhearts.com/diary/archives/001239.html
PEARの本体のバージョンが古いことが原因のようです。結構同じエラーではまった方も少なくないようで、852行目という数字まで一緒だったりします(ある意味、当たり前?)。レンタルサーバの事業者に連絡してPEAR本体をアップグレードしてもらうのもいろいろ面倒なので、WindowsのローカルサーバにあるPEARフォルダーを丸ごとサーバにアップし、「/usr/local/lib/php」ではなくて、そちらのパスを見に行ってもらうようにプログラムすることにしました。
ini_set関数ではうまくいかなかったので、.htaccessでinclude_pathを変更して、やっと動くようになりました。
php_value include_path "/home/******/public_html/php/PEAR"
のように.htaccessの中で設定しました。これでECS4.0にようやく移行できます。
慌てて、ECS4.0でのXMLへのアクセス方法を調べてPHPプログラムを作り直してみました。ところが、なかなかうまくいきません。ECS 3.0の時は、xml_parse_into_struct関数を使ってやっていたのですが、Amazonのデータには、例えばある商品には「Availability」が設定されていても、設定されていない商品(=在庫が無い商品)がありますので、単純な配列の要素番号でのアクセスはバグります。Amazon Web Serviceでの開発を始めた数年前の時は、このような異常な?(というより、技量の低いプログラマーには不都合な)データは少なかったように思うのですが(そのようなデータがあった場合には、その都度、対処療法で対処していました。)、今回、ECS4.0用にいざ書き換えとうとして、いろいろ調べてみると、そのようなデータが非常に多いことに気づかされました。空データであれば、XMLデータの中に最初から入っていないようです。転送量を考えても、当然の仕様かもしれません。
xml_parse_into_struct関数の使い方が間違っている可能性もありますが、もはや対処療法では不可能ぽいので、別の方法を探ってみることにしました。PHP5ならSimpleXML関数が使えますが、私が使っているレンタルサーバはPHP4なので、使えません。そこで、PEAR(http://pear.php.net/package/XML_Serializer )を使ってみることにしました。私のレンタルサーバにもPEARがインストールされていることは分かっていたからです。
もしかして、わざわざ、Unserializer.phpとSerializer.phpをアップしなくても、既に同パッケージはインストールされていて、使えるようになっているのかなと思って、ためしに両ファイルを削除してみると、今度は、「require_once("XML/Unserializer.php");」のところで、「main(XML/Unserializer.php) [function.main]: failed to open stream: No such file or directory
Fatal error: main() [function.require]: Failed opening required 'XML/Unserializer.php' (include_path='.:/usr/local/lib/php') in /usr/home/*******/public_html/test.php on line 2」となり、やっぱりダメです。サーバ事業者に連絡してXML_Serializerをインストールしてもらうか、自分のユーザー領域にコピーして使う(もちろん、sethandlerobjのエラーを解消しなければなりません。)しかないようです。
では、何でsethandlerobjのところでエラーになるのかなと思ってGoogleで調べてみたところ、原因はすぐに分かりました。
●undefined function: sethandlerobj() (Nega Diary)
http://www.ironhearts.com/diary/archives/001239.html
PEARの本体のバージョンが古いことが原因のようです。結構同じエラーではまった方も少なくないようで、852行目という数字まで一緒だったりします(ある意味、当たり前?)。レンタルサーバの事業者に連絡してPEAR本体をアップグレードしてもらうのもいろいろ面倒なので、WindowsのローカルサーバにあるPEARフォルダーを丸ごとサーバにアップし、「/usr/local/lib/php」ではなくて、そちらのパスを見に行ってもらうようにプログラムすることにしました。
ini_set関数ではうまくいかなかったので、.htaccessでinclude_pathを変更して、やっと動くようになりました。
php_value include_path "/home/******/public_html/php/PEAR"
のように.htaccessの中で設定しました。これでECS4.0にようやく移行できます。
| 固定リンク
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67411/40108538
この記事へのトラックバック一覧です: PHP・PEARでXMLを処理する:

コメント