ホームページ  >  記事  >  バックエンド開発  >  カールを使用して PHP で HTTP チャンク データを読み取る方法については、curlchunked_PHP チュートリアルを参照してください。

カールを使用して PHP で HTTP チャンク データを読み取る方法については、curlchunked_PHP チュートリアルを参照してください。

WBOY
WBOYオリジナル
2016-07-12 08:58:161004ブラウズ

PHP がカールを使用して HTTP チャンク データ、curlchunked を読み取る方法について

Web サーバーから返される HTTP チャンク データの場合、すべての応答が返された後にコールバックするのではなく、各チャンクが返されるときにコールバックを取得する必要がある場合があります。例えばサーバーがicometの場合

PHPでcurlを使用するためのコードは次のとおりです:

リーリー

ただし、ここで問題が発生します。icomet のチャンクは "n" で終わるため、コールバック関数が複数回呼び出される可能性があります。コールバック関数はバッファリングできます

リーリー

fsockopen を使用してセグメント化されたデータ (転送エンコーディング: チャンク) を読み取るためのチャンク化された PHP を紹介します

fsockopen を使用してデータを読み取るときに、魔法の問題が発生しました。具体的な状況は次のとおりです。

閲覧アドレス: http://blog.maxthon.cn/?feed=rss2


コードを読む:


リーリー

http コンテンツを返す:

リーリー

上記の赤でマークされた 4 つの文字に注意してください。これらはデータごとに表示されますが、curl や file_get_contents などの他のメソッドを使用して取得したデータにはこれらの文字はありません。他の Web サイトに切り替えてクロールすると、この問題は少数の Web サイトでのみ発生します。解決策が見つからずに何度も検索した後、上記のリターン ヘッダーに誤って次のようなステートメントが表示されました。 Transfer-Encoding: chunked、および common Content The -lengthフィールドがなくなってしまいました。このステートメントの一般的な意味は、転送エンコーディングがセグメント化されていることです。


Google でこのキーワードを検索し、Wikipedia でこの記述の説明を見つけてください (中国語版がないため、自分で翻訳することしかできません):


リーリー


チャンク転送エンコーディングは、HTTP メッセージを複数の部分に分けて送信できるようにするメカニズムです。 HTTP リクエスト (クライアントからサーバー) と HTTP 応答 (サーバーからクライアント) の両方に適用されます


たとえば、HTTP サーバーがクライアント アプリケーション (通常は Web ブラウザ) にデータを送信する方法を考えてみましょう。通常、HTTP 応答で配信されるデータは、Content-Length で示される長さでまとめて送信されます。ただし、チャンク エンコーディングでは、データが一連のデータ ブロックに分割され、1 つまたは複数のデータ ブロックで送信されるため、データの長さは重要です。サーバーが送信するコンテンツの最終的なサイズを知る前にデータの送信を開始できるように、より多くの「チャンク」を追加します。多くの場合、これらのブロックのサイズは同じですが、常にそうとは限りません。


たとえば、HTTP サーバーがクライアント アプリケーション (通常は Web ブラウザ) にデータを送信する方法を考えてみましょう。通常、HTTP 応答データは 1 つのブロックでクライアントに送信され、データの長さは Content-Length ヘッダー フィールドで表されます。クライアントは応答がどこで終了し、後続の応答がいつ始まるかを知る必要があるため、データの長さは重要です。チャンク エンコーディングでは、データが一連のデータ チャンクと 1 つ以上の転送された「チャンク」に分割されるため、サーバーはコンテンツの長さを認識する前にデータの送信を開始できます。通常、これらのデータ ブロックのサイズは同じですが、絶対的なものではありません。


一般的な意味を理解した後、例を見てみましょう:


チャンクエンコーディングは、いくつかのチャンクを連結することによって形成され、長さ 0 を示すチャンクで終わります。各チャンクは、ヘッダーとテキストの 2 つの部分に分かれています。ヘッダーの内容は、テキストの次の段落の合計文字数 (16 進数) と数量単位 (通常は記述されません) を指定します。指定された長さの 2 つの部分をキャリッジ リターンとライン フィード (CRLF) で区切ります。長さ 0 の最後のチャンクの内容はフッターと呼ばれ、追加のヘッダー情報です (通常は直接無視できます)。具体的なチャンクエンコード形式は次のとおりです:


エンコードされた応答コンテンツ:

HTTP/1.1 200 OK

Content-Type: テキスト/プレーン
転送エンコーディング: チャンク化

25


これが最初のデータです

1A


それでは2つ目のデータです


0

デコードされたデータ:


これが最初のコンテンツで、これが 2 番目のデータです


状況は明らかですが、このエンコードされたデータをどのようにデコードすればよいでしょうか?


公式 PHP マニュアルの fsockopen 関数の下のコメントで、多くの人がすでに解決策を提案しています


方法1.
リーリー

方法 2.
リーリー

注: これら 2 つの関数のパラメーターは、返される http 元のデータ (ヘッダーを含む) です

興味があるかもしれない記事:

  • Web ページや POST データなどをキャプチャするための PHP の cURL ライブラリ関数の紹介
  • POST で Curl、socket、file_get_contents の 3 つのメソッドを使用してデータを送信する
  • CURL メソッドを使用するデータを POST する PHP API インターフェースへのコード
  • PHP を解析するcurl を使用して JSON 形式のデータを送信する
  • php Curl を使用して JSON 形式のデータを送信する例
  • php Curl 送信後のデータをシミュレートする例
  • php をクロールするために Curl と正規表現を使用するWeb ページデータの例
  • データの取得、ログインのシミュレート、データの POST を行うための CURL メソッドを共有する PHP 関数

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1104336.html技術記事 PHP がカールを使用して HTTP チャンク データを読み取る方法については、Web サーバーから返される HTTP チャンク データについては、...
ではなく、各チャンクが返されるときにコールバックを取得する必要がある場合があります。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。