2

ラジオ局用の非常に大きな FLAC 音楽ライブラリのオンライン管理システムを開発しようとしています。強力なサーバーと多くのユーザーがいないため、エンドポイントの要求に応じて PHP が FLAC ファイルを MP3/WAV にトランスコードするファイル ダウンロード サービスを提供できるようにしたいと考えています。

これはうまくいきます:

if($filetype == "wav")  {
    header("Content-Length: ". $bitrate * $audio->get_length());
    $command = "flac -c -d ".$audio->get_filename().".flac";
}

ob_end_flush();
$handle = popen($command, "r");
while($read = fread($handle, 8192)) echo $read;
pclose($handle);

また、トランスコーディング (この場合はデコード) が完了する前にサーバーがユーザーへのファイルの送信を開始できるようにすることで、最大速度を実現します。

ただし、問題は、このスクリプトの実行中に、ドメイン全体で Apache に他の要求を処理させることができないことです。同じマシン上の他の VirtualHosts でも問題なく動作しますが、1 人がたまたまファイルをダウンロードしている間は、誰もこの Web サイトのページを読み込めません。

私はまたproc_open、違いなしで同じことを実装しようとしましたが、ワーカー数などの Apache 設定で遊んでみました。

この動作を停止しexecて、ユーザーにファイルの送信を開始する前にエンコードプロセスが完了するのを待つ唯一の方法はありますか? それは次善のように見えるからです!:(

更新:他の人はまだ Web サイトにアクセスできますが、私はアクセスできないようです。つまり、何らかの形でセッションに関連しています。これは私をさらに混乱させます!

4

1 に答える 1

0

ストリーミングを開始する前のある時点で session_write_close() を使用してください... 読み取りパイプで stream_set_blocking(false) を使用することもできます。

于 2013-09-16T02:08:24.573 に答える