2013-01-15 52 views
2

我的測試服務器是apache 2工作php編碼。我想創建一個mp3服務器。使用php頭功能播放mp3阻止頁面

一切工作正常,但今天我試圖建立一個管理頁面,通過採取MP3信息,改變它,刪除等。有一個播放按鈕在選定的MP3頁面,點擊播放按鈕時,文件加載與頭選項和播放,

示例代碼是在這裏:

session control & 
$filename = '/home/bla..bla/mp3/'. $_GET['v'] . '.mp3'; 
if(file_exists($filename)) { 
    header('Content-Type: audio/mpeg'); 
    header('Content-length: '.filesize($filename)); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 
    readfile($filename); 
}else{ 
    exit(); 
} 

一切都看起來不錯,但是當我點擊另一個按鈕(例如,使用Ajax代碼再次搜索mp3或採取值在同一個頁面的JavaScript)什麼正在發生。

頁面正在等待加載mp3文件。看起來像阻止請求。當mp3加載%60或%70時,查詢即將到來。

如果我不能找到一個解決方案,我將是殺手:)

PS:我的系統上apache2, PHP5 , MySQL,建設使用管理網頁音頻標籤,但同樣的問題jplayer

+0

向我們展示您的客戶端代碼,因爲這是問題所在。另外,您的PHP腳本中存在一些安全問題。不要讓用戶在路徑上放置任何他們想要的東西!確保你從$ _GET ['v']'去掉任何'..'。 – Brad

回答

1

最有可能你碰到會話鎖定。當請求一個頁面,其中你session_start(),會話文件打開並鎖定,以防止併發訪問問題。該文件保持鎖定狀態,直到當前腳本完成。當文件被鎖定時,其他進程將無法訪問它,並會等待它解鎖。

在執行任何長時間運行的任務(如流式傳輸MP3文件)之前,請使用session_write_close解鎖會話。

更好的是,讓web服務器處理流文件的普通任務,不要讓PHP進程忙於它。嘗試mod_xsendfile

+0

謝謝我的朋友你救了我的命:) –