2

質問

アップロードファイルをPHP経由でストリーミングして、最初のクライアントがアップロードしている間に他のクライアントがそれをダウンロードできるようにすることは可能ですか?

ファイルをサーバーに永続的に保存したくありません。どうやってやるの?

なぜPHPなのか?

ダウンロードするクライアントは、ストリームを取得するために追加のソフトウェアを必要としないはずです。最も簡単な方法はウェブブラウザだと思いました。

4

3 に答える 3

3

可能ですが、実装はかなり厄介になります。主な障害は、マルチパートPOSTリクエストの処理がPHPにハードコードされていることです。スクリプトを呼び出す前に、常にファイルを一時的な場所に保存します。回避策の1つは、PHP-CLIをCGIスクリプトとして設定することです。PHPのCLIバージョンはHTTPに対応していないため、受信データを入手できます。

.CGIファイルは次のようになります。

#!/usr/local/src/php-4.3.4/sapi/cli/php
<?php

// populate $_GET
parse_str($_ENV['QUERY_STRING'], $_GET);

// get the session id from the cookie
parse_str($_ENV['HTTP_COOKIE'], $_COOKIE);
$session_name = ini_get("session.name");
$session_id = $_COOKIE[$session_name];

// get the length of the request body
$length = (int) $_ENV['CONTENT_LENGTH'];

// read the POST data
$stdin = fopen("php://stdin", "rb");

while($chunk = fread($stdin, 4096)) {
    [...]
}

?>

RFC1867リクエストの解析は簡単ではありません。アップロード側とダウンロード側を調整するのもかなり難しいと思います。

于 2012-10-16T15:32:49.460 に答える
2

直接できないようです。PHPスクリプトは、ファイルのアップロードが完了するまで実行されません。APCを使用すると、アップロードされているファイルの進行状況を取得できるようですが、実際のバイト自体は取得できません。他の唯一の方法は、ソケットを使用してPHPで独自のサーバーを作成することです。

別の方法として、Node.js(または実際には他の何か)がある場合は、次のようなことを行うことができます。

  1. クライアントAが接続し、アップロードを開始します
  2. サーバーがディスクへのアップロードの書き込みを開始します
  3. クライアントBが接続し、クライアントAのデータのダウンロードを要求します
  4. サーバーはバッファリングされたデータをディスクから読み取り、クライアントAに送信します
  5. クライアントAまたはBが切断されるまで、サーバーはデータが利用可能になると送信を続行します

ディスクバッファオプションが最も簡単ですが、大きなファイルやライブストリームの場合、クライアントBが追いつくことができる場合、またはデータ損失がない場合は、データが途中でディスクなしで受信されるため、直接送信にロールオーバーすることをお勧めします。問題ありません。

于 2012-10-16T14:41:24.187 に答える
0

tusプロトコルを調べる必要があります-それをサポートするphpライブラリ(https://github.com/ankitpokhrel/tus-php)と、クライアント側のuppy(uppy.io)を含むJavascriptフレームワークがあります。

于 2019-05-23T22:08:29.390 に答える