PHPでは、ファイルのダウンロードを処理する際には、ブレークポイントの継続が一般的な要件です。これにより、ユーザーは、ダウンロードプロセスが切断された後、中断された場所からダウンロードを続けることができ、ファイル全体の再ダウンロードを回避できます。通常、ブレークポイントの連続伝送を実装するための鍵は、HTTPヘッダーの処理と、範囲要求に対するサーバーのサポートにあります。
それで、 stream_context_set_paramsを使用してファイルブレークポイント連続伝送を実装できますか?それを構成する方法は?
stream_context_set_paramsは、既存のストリームコンテキストのパラメーターを設定するためにPHPで使用される関数です。多くの場合、タイムアウト、通知コールバックなどのストリームの動作を調整するために使用されます。その使用フォームは次のとおりです。
stream_context_set_params(resource $stream_context, array $params): bool
パラメーターを含めることができます:
通知:コールバック関数を設定します
タイムアウト:タイムアウト時間(秒)を設定します
ブロッキング:フローをブロックするかどうか
ブレークポイントの連続伝送の実装は、主にHTTPプロトコルの範囲ヘッダーに依存しており、サーバーはリクエストヘッダーに基づいて対応するバイト範囲のデータを返します。例えば:
Range: bytes=1000-
クライアントがBYTE 1000からダウンロードを開始したいことを示します。
そのようなリクエストを受信した後、サーバーはステータスコード206部分コンテンツを返し、応答ヘッダーにコンテンツレンジをもたらし、クライアントに返されたファイルの部分をクライアントに伝えます。
厳密に言えば、 stream_context_set_params自体は、HTTPヘッダーを処理するように設計されていません。ストリームパラメーターを設定するために使用されます。 HTTPリクエストヘッダーの範囲を構成するために直接使用することも、サーバー側の応答ステータスコードとセグメント化された送信を処理することもできません。
BreakPointの連続伝送をサポートするPHPでHTTPリクエストを開始する場合は、httpオプションを使用してstream_context_createを使用して、次のような要求ヘッダーを設定する必要があります。
$options = [
'http' => [
'method' => 'GET',
'header' => "Range: bytes=1000-\r\n",
]
];
$context = stream_context_create($options);
$file = file_get_contents('http://m66.net/path/to/file', false, $context);
このようにして、クライアントは、指定されたバイトからファイルをダウンロードするように要求できます。
<?php
$start = 1000; // から1000バイトはダウンロードを開始します
$options = [
'http' => [
'method' => 'GET',
'header' => "Range: bytes=$start-\r\n",
'ignore_errors' => true, // 受信を許可します 206 応答
]
];
$context = stream_context_create($options);
$url = 'http://m66.net/path/to/largefile.zip';
$fileContent = file_get_contents($url, false, $context);
// できる $fileContent 既存のファイルに追加されます,連続伝送を実装し、マージします
file_put_contents('localfile.zip', $fileContent, FILE_APPEND);
?>
上記の例では、焦点は、 HTTPオプションのヘッダーに範囲を追加して、サーバーのコンテンツの一部を返すようにすることです。 stream_context_set_paramsは、リクエストヘッダーの設定に責任がないため、使用されません。
クライアントは、範囲ヘッダーでリクエストを開始し、ブレークポイントを継続するための最初のステップのみを開始し、サーバーは範囲のリクエストを正しくサポートし、応答する必要があります。
サーバーはステータスコード206部分コンテンツを返す必要があります
サーバーは、コンテンツレンジヘッダーを正しく設定する必要があります
サーバーは、ファイルのブレークポイント読み取りをサポートしています
サーバーがサポートしていない場合、クライアントは範囲ヘッダーを要求し、ファイル全体を返します。
stream_context_set_paramsは、主にhttp要求ヘッダーを設定するのではなく、ストリームパラメーターを設定するために使用され、ブレークポイントの連続伝送を直接実装することはできません。
BreakPointの連続伝送を実装するには、 Stream_Context_Createを使用し、 HTTPオプションで範囲要求ヘッダーを設定する必要があります。
サーバーは、ブレークポイントの範囲要求を正しくサポートする必要があります。
PHPファイルの操作関数と組み合わせて、クライアントブレークポイントの連続ファイルのダウンロード機能を実現できます。