2012-08-30 106 views
2

我正在使用php腳本向JWPlayer提供文件,以防止leeches獲取URL並在iPhone和Roku應用程序中使用它。所以我打電話給videoplay.php?id = myfile。輸出是一個mp4視頻流。文件通常是200-500MBytes。如何使用PHP優化資源使用情況readfile()

php腳本可以正常工作,並且對它進行了一些調整,甚至比我的初始版本還要好。但它是一種資源。當我播放一個文件時,我無法在瀏覽器中打開另一個窗口訪問同一網站上的任何頁面......我甚至無法顯示當前頁面的源代碼。如果我通過直接向播放器提供網址來播放完全相同的視頻文件,我就不會遇到資源問題,並且我可以在播放視頻的同時查看頁面的來源,並且可以在同一瀏覽器中同時播放同一網站上的兩個視頻在兩個不同的頁面上)。

這裏是我的代碼

// some code to query database and get the file url 
// 
$fh = fopen($filename, "rb") or die("Could not open movie\n"); 

while (!feof($fh) && connection_status() == 0) 
{ 
    print(fread($fh, 1024*8)); 
    flush(); 
    ob_flush(); 
    usleep(10000); 
} 

fclose($fh); 

我加了usleep設法限制資源的使用,並沒有工作,但影片似乎加載速度更快。當我長時間逗留(例如1/10秒)時,視頻需要更長的時間才能加載。如果我在1024 * 4和1024 * 16之間改變塊大小,8kbyte似乎會導致視頻加載時間最快。 16kbyte使用更多資源,似乎最大限度地減少了我的25MBit連接。根本不會從我的本地服務器加載視頻(但我們的雲服務器上的遠程視頻會加載)。將塊大小減少到1k字節並不能解決資源問題。

我在做什麼錯?

+1

該頁面是否使用會話?可能是會話鎖定問題,您無法在加載網站時加載網站上的任何其他頁面。 – Maerlyn

+0

是的,它使用會話。我會盡力關閉它。 –

回答

3

這可能是因爲你錯過了使用session_write_close()。將函數調用添加到流式傳輸的開始處。會話鎖定可能是您的腳本的原因,因爲腳本正在等待彼此完成才能繼續。

+0

行得通。但是如果我調用session_write_close(),那麼我不能添加或更新任何變量嗎? –

+0

是的,在你調用'session_write_close()'後,任何'$ _SESSION'的變化都不會被保存。 – mauris