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 上正常工作,但是当一个人碰巧正在下载文件时,没有人可以加载该网站上的任何页面。

我也尝试过使用proc_open没有区别的方法来实现相同的东西,并且已经使用了 Apache 设置来设置工人数量等。

在我开始向用户发送文件之前,停止这种行为的唯一方法是使用类似的东西exec并等待编码过程完成吗?因为这似乎不是最理想的!:(

更新:似乎其他人仍然可以访问该网站,但不是我 - 即它与会话有关。这让我更加困惑!

4

1 回答 1

0

在开始流式传输之前的某个时间点使用 session_write_close() ...您可能还想在读取管道上使用 stream_set_blocking(false)。

于 2013-09-16T02:08:24.573 回答