在通过CURL进程写入PHP时从PHP流式传输本地文件

时间:2010-01-09 20:31:06

标签: php proxy curl stream fopen

我正在为我的网站创建一个简单的代理服务器。为什么我不使用mod_proxy和mod_cache是​​一个不同的讨论。这是代码:

    shell_exec("nohup curl --create-dirs -o {$write_path} {$source_url} > /dev/null 2> /dev/null & echo $!");
    sleep(1);

    $read_speed = 65.5; # 65.5 kb/s download rate
    $handle = fopen($write_path, "rb");

    $content_type = select_meta_item($headers, 'Content-Type');
    $file_size = select_meta_item($headers, 'Content-Length');
    send_headers($content_type, $file_size); 
    flush();

    while (!feof($handle))
    {
        echo fread($handle, round($read_speed * 1024));
        flush();
        sleep(1);
    }

    fclose($handle);

使用此方法无法播放MP3。在Chrome中播放,但在Firefox中播放。最初我将使用它来通过Long Tail的JW Player流式传输MP3文件。如果一切顺利,我也会用它来发送ZIP文件。

2 个答案:

答案 0 :(得分:0)

问题是您的文件格式是否可以由客户端实现进行流式处理。如果Firefox does not support playing an mp3在下载完成之前,没有任何服务器端技巧可以帮助您实现流式传输。您将需要客户端支持,例如基于闪存的内联播放器。

对于ZIP文件,假设编码表位于存档的 end ,则在完全下载之前,任何软件都无法打开它。

作为旁注,您是否考虑创建FIFO,将curl指向FIFO输入,并将readfile应用于FIFO输出,从而让操作系统处理事情?

答案 1 :(得分:0)

我明白了。它的代码工作得很好。

文件由APACHE由404处理程序(ErrorDocument)调用。 Apache在调用PHP脚本之前自动发送404标头。

此文件(上面的代码),不启动CURL过程并重定向到流式传输的文件。由于Apache返回404,Firefox忽略了MP3响应。 (而Chrome没有)。现在我重定向,它工作正常。