2010-03-31 37 views
2

因此,我有三臺服務器,並且想法是將所有媒體(圖像,文件,電影)保留在媒體服務器上。我從來沒有做過,但我想我應該這樣做。如何處理保存在單獨服務器上的媒體(PHP)

所以這是三個服務器:

WWW服務器 DB服務器 媒體服務器

遊客顯然連接到WWW服務器和當前圖像大小調整和緩存:ING是WWW服務器作爲上完成原始文件保存在那裏。所以對我來說,這個想法是爲我的圖像功能,所有的圖像組成,調整大小和cahceing將只是命令到媒體服務器,將返回到finnished文件的路徑。

我不知道如何處理函數如file_exists(),並在需要時計算圖像尺寸,甚至在任何圖像管理進場之前。我是否通過HTTP將所有這些命令傳遞給其他服務器?我正在考慮這樣做的方式:

function image(##ARGS##){ 
    if ($GLOBALS["media_host"] != "localhost"){ 
     list ($src, $width, height) = file('http://$GLOBALS[media_host]/imgfunc.php?args=##ARGS##'); 
     return "<img src='$src' height and width >"; 
    } 
    .... do other stuff here 
} 

我接近這個錯誤的方式嗎?有一個更好的方法嗎?

回答

1

想象一下媒體服務器是一個S3存儲桶,可能會讓你的生活更容易理解在哪裏應該發生什麼。在媒體服務器上安裝lighthttpd並直接從那裏提供圖像。對於存儲,在主服務器上處理圖像,將圖像上傳到媒體服務器,將與圖像相關的所有信息存儲在數據庫中,以便當您想要提供圖像時,您已經擁有了所有可用的信息,並假設爲所有正確的原因,圖像仍然存在:)

至於你想這樣做的方式,我認爲這會造成嚴重的瓶頸,並引發大量的網絡流量,你有點試圖實現「消息「在分佈式系統中找到,我們都知道那裏涉及的陷阱。我說保持簡單!

0

您需要在媒體服務器上打開一個端口來檢索信息,這正是您正在做的。你的方法沒問題(只要你可以在公共端口上使用這個功能)。

我假設任何媒體文件信息都沒有存儲在數據庫中。

2

不知道你要什麼,但我還留着媒體文件在不同的服務器上,從我的代碼:

我使用Amazon S3存儲的媒體文件,而我只是包括在基本標籤我的HTML文件的頭部,使一切工作。基本上,它會獲取所有相關的文件/鏈接並將這些相對路徑指向其他服務器。

<base href="https://s3.amazonaws.com/BUCKET/PROJECT/FOLDER/" /> 

有些人可能會以這種方式反對我使用基礎href標記,但它對我來說真的很好。通過這種方式,我可以將所有圖像加載帶寬導向亞馬遜並遠離我的服務器。

1

要找出一個遠程文件存在,運行HEAD請求:

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, "url here"); 
curl_setopt($curl, CURLOPT_HEADER, true); 
curl_setopt($curl, CURLOPT_NOBODY, true); 
curl_exec($curl); 
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
curl_close($curl); 

if($code == 200) 
    // The file exists. 
0

除非你用啞(非腳本)主機,這是一個壞主意,讓顯著節省成本 - 使系統失敗的概率加倍。如果你有兩臺主機,最好的解決方案是將它們作爲精確的鏡像。如果您需要進行會話/數據複製,那麼這確實會帶來一些小的開銷 - 但這是值得的。通過輪循DNS分配負載。此外,這意味着您只需備份一個站點,並從一臺服務器(例如您的開發箱)擴展到......即可。

我還建議您不要存儲已提交文件的修改版本(除了初始轉換以防止它們在您的服務器上發佈您不想要的內容)。然後根據需要轉換內容(並使用服務器端緩存)。

通過不同的DNS名稱提供內容的一個好處是,大多數瀏覽器會並行運行更多請求 - 但您仍然可以使用多個虛擬主機或通配符虛擬主機與克隆服務器執行此操作。

C.