アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPでsimplexml_load_fileの引数に長いURLを指定すると結果が返りません。
file_get_contents でも同様です。

PHP初心者です。
ある程度の長さまで(バイト数不明)までは大丈夫です。
今日一日検索と実験をかなり行いましたが、解決できず困り果てています。
どなたかヒントやアドバイスをいただけると大変助かります。

サーバー Windows 2008 Server + IIS
PHPVer 5.3.2

【概要】
Yahooの形態素解析APIを使用するため奮闘しています。
http://developer.yahoo.co.jp/webapi/jlp/ma/v1/pa …
取得したサンプルに倣いエンコードしたテキストをURLに加え送信するのですが
A) 短いテキストだとうまくいきますが(UTF8の日本語で900文字ぐらいか)B) 長いテキストたとえばどこかのWebページのテキストすべてなどでは PHP Warningがログに残り失敗ます。

最終的には以下のようなクエリーストリングを生成し(simplexml_load_fileの引数として)送信しようとしています。が送信できていません。
http://jlp.yahooapis.jp/MAService/V1/parse?appid … app id>&results=ma&sentence=+%5BPR%5D+2010%E5%B9%B49%E6%9C%8816%E6%97%A5%28%E6%9C%A8%29+%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3+%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%
<長いので途中省略>
AA%E5%B7%A5%E4%BC%9A+10%E2%80%9012%E6%9C%88%E6%9C%9F%E3%81%AF%E8%B8%8A%E3%82%8A%E5%A0%B4%E5%85%A5%E3%82%8A%E3%81%AE%E5%85%AC%E7%AE%97%E3%81%8B+%E9%81%8A%E5%9C%92%E5%9C%B0%E3%81%AE%E3%83%87%E3%83%BC%E3%83%88%E3%80%81%E3%83%88%E3%83%83%E3%83%97%E3%81%AF%E8%A6%B3%E8%A6%A7%

【試したこと・わかったこと】
長いURLを送信しようとするとphpのログには2種類のエラーが記録される

(ア)PHP Warning: simplexml_load_file(http://jlp.yahooapis.jp <以下上記サンプルのURL続く>
(イ)PHP Warning: simplexml_load_file(): I/O warning : failed to load external entity "http://jlp.yahooapis.jp/MAService/V1/parse?<以下上記サンプルのURL続く>

テキストを短くすると送信でき期待通りxmlが返ってくる。
上記の元URLをIEのアドレスバーに入力すると xml が正常に返ってくる
file_get_contents で同じことを行う場合も同様にエラー(上記エラー(ア)となり値が返らない

http://developer.yahoo.co.jp/sample/jlp/sample2. … で紹介されているデモサイトでも同様の問題が起きている模様。。。
http://cgi.geocities.jp/ydevnet/sample/jlp/sampl …


【関係ありそうな php.ini の現在の設定】
allow_url_fopen = On
allow_url_include = On

以上 よろしくお願いいたします。

A 回答 (2件)

興味があったので、file_get_contentsに何文字までなら入力可能なのか調べてみました。



結果、「8193」バイトの文字列以上入力するとこけるようです。
※XAMPPのPHP5.2.3にて計測

8192は2/8/16進数的にきりのいい数値ですので、何か意味があるのでしょうかね・・・

とりあえず、しようがないので、
fsockopen関数で代替してはどうでしょう。

http://php.net/manual/ja/function.fsockopen.php
ホスト名でソケットをあけて、HTTPヘッダを送信してやるという感じです。
マニュアルのサンプルを参考にして作成してみてはいかがでしょう。

または、Zend Frameworkの「Zend_Client」や、PEARの「HTTP_Request2」などはこれをラップしたライブラリなので、もっと簡単に出来ます。
    • good
    • 0
この回答へのお礼

お返事が遅れてすみません。限度数、調査いただきましてたいへんありがとうございました。
おかげさまでここでの調査時間が短縮できましたこと深く御礼申し上げます。

ご指導いただいた fsockopen で悪戦苦闘しながら解決策を模索しておりましたが、今度は受け側であるYahooから切断されるようになりました。一歩進みましたがまた後退ということで、ほかの解決策を模索してみます。

PHP Notice: fwrite(): send of 8192 bytes failed with errno=10054 既存の接続はリモート ホストに強制的に切断されました。

お礼日時:2010/09/21 23:18

(ア)Warning かどうかじゃなく、エラーメッセージに注目しようとは思わなかったんですか?


(イ)failed to load external entity. 外部実体の読み込みに失敗しました。
要するに、送ったけど、返事が返ってこなかったぜ、と言っている。

マニュアルはちゃんと読んだんですか?PHP は元より、Yahoo のほうも。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!