2010-01-09 175 views
1

我正在爲我的網站創建一個簡單的代理服務器。爲什麼我不使用mod_proxy,而mod_cache是​​一個不同的討論。這裏是代碼:通過CURL流程寫入本地文件時從PHP流式傳輸

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文件。

回答

0

我想通了。它的代碼工作正常。

該文件由404處理程序(ErrorDocument)由APACHE調用。在調用PHP腳本之前,Apache會自動發送404頭文件。

此文件(上面的代碼)不啓動CURL進程並重定向到流式傳輸的文件。由於Apache返回了404,Firefox忽略了MP3響應。 (而Chrome沒有)。現在我重定向了,它工作正常。

0

問題是您的文件格式是否可以通過客戶端實現進行流式傳輸。如果Firefox does not support playing an mp3直到下載完成,服務器端的欺騙將無法幫助您實現流式傳輸。您需要客戶端支持,例如基於閃存的內聯播放器。

對於ZIP文件,假設編碼表位於檔案的末尾,則在軟件完全下載之前,軟件無法打開它。請注意,是否考慮創建一個FIFO,在FIFO輸入處指向curl,並將readfile應用於FIFO輸出,從而讓操作系統處理事務?