質問
アップロードファイルをPHP経由でストリーミングして、最初のクライアントがアップロードしている間に他のクライアントがそれをダウンロードできるようにすることは可能ですか?
ファイルをサーバーに永続的に保存したくありません。どうやってやるの?
なぜPHPなのか?
ダウンロードするクライアントは、ストリームを取得するために追加のソフトウェアを必要としないはずです。最も簡単な方法はウェブブラウザだと思いました。
アップロードファイルをPHP経由でストリーミングして、最初のクライアントがアップロードしている間に他のクライアントがそれをダウンロードできるようにすることは可能ですか?
ファイルをサーバーに永続的に保存したくありません。どうやってやるの?
ダウンロードするクライアントは、ストリームを取得するために追加のソフトウェアを必要としないはずです。最も簡単な方法はウェブブラウザだと思いました。
可能ですが、実装はかなり厄介になります。主な障害は、マルチパート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リクエストの解析は簡単ではありません。アップロード側とダウンロード側を調整するのもかなり難しいと思います。
直接できないようです。PHPスクリプトは、ファイルのアップロードが完了するまで実行されません。APCを使用すると、アップロードされているファイルの進行状況を取得できるようですが、実際のバイト自体は取得できません。他の唯一の方法は、ソケットを使用してPHPで独自のサーバーを作成することです。
別の方法として、Node.js(または実際には他の何か)がある場合は、次のようなことを行うことができます。
ディスクバッファオプションが最も簡単ですが、大きなファイルやライブストリームの場合、クライアントBが追いつくことができる場合、またはデータ損失がない場合は、データが途中でディスクなしで受信されるため、直接送信にロールオーバーすることをお勧めします。問題ありません。
tusプロトコルを調べる必要があります-それをサポートするphpライブラリ(https://github.com/ankitpokhrel/tus-php)と、クライアント側のuppy(uppy.io)を含むJavascriptフレームワークがあります。