php エディター Zimo では、ストリーミング HTTP 応答を処理する方法を紹介します。 Web アプリケーションを開発する場合、多くの場合、大きなファイルのダウンロードやリアルタイム ストリーミング メディアの送信に対処する必要があります。応答コンテンツ全体を一度にロードする従来の方法では、過剰なメモリ使用量が発生し、パフォーマンスに影響を与えます。この問題を解決するには、ストリーミング HTTP 応答を使用します。 HTTP 応答をストリーミングすると、応答コンテンツをチャンクで送信できるため、メモリ使用量が削減され、ユーザー エクスペリエンスが向上します。 PHP では、いくつかのライブラリまたはカスタム メソッドを使用してストリーミング HTTP 応答を実装し、Web アプリケーションを最適化できます。
次の例は、応答をチャンクでストリーミングして返し、JSON 構造を作成する HTTP サービスに接続します。私のコードはブロックごとに、バイト rb
配列と個々の行を追加します。ただし、私の問題は、rb
が完了してデコードできるようになったときに解決しようとしています。
ここで明らかな何かが欠けていますか?
package main import ( "bufio" "bytes" "fmt" "io" "net/http" ) func main() { body := []byte("test") resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() fmt.Printf("Status: [%s]\n", resp.Status) fmt.Println() //var rb []byte reader := bufio.NewReader(resp.Body) var rb []byte for { line, err := reader.ReadBytes('\n') if err != nil { if err == io.EOF { break } fmt.Printf("Error reading streamed bytes %v", err) } rb = append(rb, line...) fmt.Println(rb) } }
プログラムのバグを無視して、ループが中断された後にrb
Completeします。
このプログラムにはエラーがあります:
あなたの目標は、rb
への応答全体を吸収することのようです。これを行うには、io.ReadAll を使用します:
応答本文を JSON にデコードする場合は、JSON デコーダー に応答本文を読み取らせる方が良い方法です。 リーリー
以上がストリーミング HTTP 応答の処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。