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 関数
http://www.bkjia.com/PHPjc/1104336.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1104336.html技術記事 PHP がカールを使用して HTTP チャンク データを読み取る方法については、Web サーバーから返される HTTP チャンク データについては、...
ではなく、各チャンクが返されるときにコールバックを取得する必要がある場合があります。