2

小さなcronジョブでfsockopenを使用して、さまざまなサーバーのフィードを読み取って解析しています。ほとんどの場合、これは非常にうまく機能します。しかし、一部のサーバーでは、応答に次のような非常に奇妙な行が表示されます。

<言語>エン語</言語>
 <sy:updatePeriod>毎時</ sy:updatePeriod>
 <sy:updateFrequency> 1 </ sy:updateFrequency>

11
 <アイテム>
  <タイトル>
1f
2010年7月8日</title>
  <リンク>
32
http://darkencomic.com/?p=2406 </ link>
  <コメント>
3e

しかし、たとえばnotepad ++でフィードを開くと、正常に機能し、次のように表示されます。

<言語>エン語</言語>
 <sy:updatePeriod>毎時</ sy:updatePeriod>
 <sy:updateFrequency> 1 </ sy:updateFrequency>
   <アイテム>
  <title>2010年7月8日</title>
  <link> http://darkencomic.com/?p=2406 </ link>
  <コメント>

...抜粋を表示するだけです。それで、私はここで何か間違ったことをしていますか、それともこれは私のコントロールを超えていますか?これを修正するためのアイデアに感謝します。フィードを取得するために使用しているコードの一部は次のとおりです。

$ fp = @fsockopen($ url ["host"]、80、$ errno、$ errstr、5);
  if(!$ fp){"。$url["host"]。" ");
   を開くときに新しいUrlException("($ errno)$errstr~~~をスローします。
  } そうしないと {
   $ out ="GET"。$path。"HTTP/ 1.1 \ r \ n"
     。"ホスト:"。$url["host"]。"\r \ n"
     。"接続:閉じる\ r \ n \ r \ n";
   fwrite($ fp、$ out);
   $ contents ='';
   while(!feof($ fp)){
    $contents。=stream_get_contents($ fp、128);
   }
   fclose($ fp);
4

2 に答える 2

2

これは、HTTPチャンク転送エンコーディングのように見えます。これは、HTTPが応答をいくつかの小さな部分にセグメント化する方法です。引用:

空でない各チャンクは、埋め込むデータのオクテット数(16進数で記述されたサイズ)で始まり、その後にCRLF(キャリッジリターンとラインフィード)、およびデータ自体が続きます。
次に、チャンクはCRLFで閉じられます。
一部の実装では、空白文字(0x20)がチャンクサイズとCRLFの間に埋め込まれます。


などを扱うfsockopenときは、HTTPプロトコルを自分で処理する必要があります...これは、思っているほど簡単ではありません;-)

そのようなものに対処する必要を回避するための解決策は、 curlのようなものを使用することです:それはすでにHTTPプロトコルを知っています-つまり、あなたは地獄を再発明する必要はありません;-)

于 2010-07-14T12:27:20.187 に答える
0

そのような振る舞いを引き起こすような奇妙なことは何も見当たりません。cURLを使用してこれを行う方法はありますか?それは問題を完全に解決するかもしれません:)

于 2010-07-14T12:26:07.277 に答える