ホームページ  >  記事  >  バックエンド開発  >  大きなPHPファイルを送信できない場合はどうすればよいですか?

大きなPHPファイルを送信できない場合はどうすればよいですか?

藏色散人
藏色散人オリジナル
2023-01-18 09:22:311990ブラウズ

php が大きなファイルを送信できない問題の解決策: 1. "Ranges:(unit=first byte pos)-[last byte pos]"; のような構文で Range パラメータを設定します。 2. "Content" を設定します。 -Range"; 3. 「GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219」リクエストを介してファイル全体をダウンロードします。

大きなPHPファイルを送信できない場合はどうすればよいですか?

このチュートリアルの動作環境: Windows 10 システム、PHP バージョン 8.1、DELL G3 コンピューター

次の場合はどうすればよいですかphpでは大きなファイルは送信できないのですか?

非常に大きなファイルをアップロードするための PHP ソリューション

1. 概要

いわゆる履歴書のアップロードは、実際には単にダウンロードを指します。これは、ファイルがダウンロードされた時点からダウンロードを続けることを意味します。ブレークポイントは、HTTP プロトコルの以前のバージョンではサポートされていませんでしたが、HTTP/1.1 以降はサポートされています。通常、Range および Content-Range エンティティ ヘッダーはブレークポイントのダウンロードにのみ使用されます。 HTTP プロトコル自体はブレークポイントのアップロードをサポートしていないため、自分で実装する必要があります。

2. 範囲

は、通常、最初のバイトの位置と最後のバイトの位置を指定するためにリクエスト ヘッダーで使用されます。形式:

範囲: クライアントからサーバーへのリクエストに使用されます。フィールドを変更することで、ダウンロードされるファイルの特定のセグメントのサイズと単位を指定できます。バイト オフセットは開始されます。 0から。一般的な形式:

    Ranges:    (unit=first byte pos)-[last byte pos]
    Ranges:    bytes=4000- 下载从第4000字节开始到文件结束部分
    Ranges:    bytes=0~N 下载第0-N字节范围的内容
    Ranges:    bytes=M-N 下载第M-N字节范围的内容
    Ranges:    bytes=-N 下载最后N字节内容

1. 次の点に注意する必要があります:

(1) このデータ間隔は閉じた間隔であり、開始値は 0 であるため、「Range: bytes=0-1」のようなリクエストは実際には最初の 2 バイトをリクエストしています。

(2) "範囲: bytes=-200" は、ファイルの先頭で 201 バイトを要求することを示すのではなく、ファイルの末尾で 200 バイトを要求することを示します。

(3) 最後のバイト pos が最初のバイト pos より小さい場合、この Range リクエストは無効なリクエストです。サーバーはこの Range リクエストを無視し、200 で応答し、ファイル全体を送信する必要があります。クライアント。

(4) 最後のバイト pos がファイル長以上の場合、Range リクエストは満たされないとみなされるため、サーバーは 416、Requested range not Satisfiable で応答する必要があります。

2. 説明例:

は最初の 500 バイトを表します: bytes=0-499

は 2 番目の 500 バイトを表します: bytes =500- 999

最後の 500 バイトを表します: bytes=-500

500 バイト以降の範囲を表します: bytes=500-

最初と最後の 1 バイト: bytes=0 -0,-1

同時に複数の範囲を指定します: bytes=500-600,601-999

3. Content-Range

は、エンティティ全体の一部の挿入位置を指定する応答ヘッダーで使用され、エンティティ全体の長さを示します。サーバーは部分応答をクライアントに返す前に、応答がカバーする範囲とエンティティ全体の長さを記述する必要があります。一般的な形式:

Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]

4. ヘッダーの例

ファイル全体のダウンロード要求:

GET /test.rar HTTP/1.1 
Connection: close 
Host: 116.1.219.219 
Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头

一般的な通常の応答

HTTP/1.1 200 OK 
Content-Length: 801      
Content-Type: application/octet-stream 
Content-Range: bytes 0-800/801 //801:文件总大小

ブレークポイント再開の最も単純な実装は、おおよそ次のとおりです。

1. クライアントは 1024K ファイルをダウンロードし、そのうち 512K がダウンロードされました

2. ネットワークが中断され、クライアントが送信の再開を要求するため、HTTP ヘッダーで次のように宣言する必要があります。今回再開する必要があるフラグメント:

Range:bytes=512000-

このヘッダーは、ファイルの 512K 位置からファイルの送信を開始するようにサーバーに通知します

3。サーバーはブレークポイント再開リクエストを受信し、開始します。ファイルの 512K 位置からの送信で、HTTP ヘッダーに

Content-Range:bytes 512000-/1024000

を追加します。この時点でサーバーから返される HTTP ステータス コードは 200 ではなく 206 である必要があります。

しかし、実際のシナリオでは、端末が再開要求を開始したときに、URL に対応するファイルの内容がサーバー側で変更されており、再開データが間違っている必要があるという状況が発生します。この問題を解決するにはどうすればよいでしょうか?現時点では、ファイルの一意性を識別する方法が必要であることは明らかです。 RFC2616 にも、ファイルの最終変更時刻を識別する Last-Modified の実装など、ファイルが再開されたときにファイルが変更されたかどうかを判断できる、対応する定義があります。同時に、RFC2616 では ETag ヘッダーも定義されており、ETag ヘッダーを使用して、ファイルの MD5 値など、ファイルの一意の識別子を配置できます。

端末が再開リクエストを開始するときは、サーバーがファイルの変更を識別できるように、HTTP ヘッダーで If-Match フィールドまたは If-Modified-Since フィールドを宣言する必要があります。

また、RFC2616ではIf-Rangeヘッダも定義されており、端末が送信を継続する場合にはIf-Rangeを使用します。 If-Range の内容は、最初に受信した ETag ヘッダー、または Last-Modfied の最終変更時刻になります。サーバーは再開リクエストを受信すると、If-Range の内容を検証し、一致していれば 206 再開応答を返し、矛盾していれば 200 応答を返し、応答内容はまったく新しいものになりますファイル.データ.

推奨学習: 「

PHP ビデオ チュートリアル

以上が大きなPHPファイルを送信できない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。