2013-07-24 49 views
0

假設存在一個簡單的網站,該網站在多個圖像共享網站上託管用戶圖像,以確保一臺服務器不會損壞用戶頁面的完整性。php從多個來源加載第一個圖像

是否有可能使用php(可能使用Threadcurlproc_open?)來確定哪些圖像託管站點已啓動並使用生成最快圖像傳輸的主機顯示圖像?

回答

0

我使用php的fsockopen()函數讀取第一行(標題)並檢查錯誤狀態,如404或302,以確定文件是否存在。它非常快速和高效。 php.net上有很多關於如何使用fsockopen的文檔。 $ path contains包含圖像的文件名。

$fp = @fsockopen($domain, 80, $errno, $errstr, 1); 
if ($fp) { 
    $out = "GET $path HTTP/1.1\r\n"; 
    $out .= "Host: $domain\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    ... 
} 
+0

謝謝,這看起來正是我想要的。我只是想知道這種方法和這裏提出的JavaScript解決方案之間的區別(http://stackoverflow.com/a/1630859/2576956)。 Javascript是客戶端,所以用戶將不得不處理嘗試加載這些圖像,我想。 fsockopen命令是否會在我的服務器上產生額外的費用,最好留給客戶處理? – bvpx

+0

JavaScript實際上正在加載圖像數據,以便它在網頁上可見。上面給出的fsockopen示例只是簡單地檢查圖像是否存在於網站上。並且比較哪個網站提供相同圖像的方法更快。不,fsockopen不會增加任何重大的額外費用,除了您無法控制的因素(如網絡延遲或遠程網站可訪問)之外。我記得去年我的測試表明,它只給我的腳本增加了幾個毫秒。 –

0

這將是利用有限的瞭解,其圖像主機託管服務提供商是從服務器到達,如果你想客戶直接從主機供應商要求的圖像。

這意味着你有兩個可靠的選擇:

  • 加載圖片到你的服務器(通過捲曲或http協議wrapers),然後從那裏
  • 使用客戶端片面腳本向客戶交付將圖像加載到客戶端。

我建議你看看第二個選項,通過PHP提供可能的圖像URL列表,然後在客戶端使用JS嘗試加載直到成功(或列表耗盡)。隨機值和可預見性閾值的組合可以使您的客戶端腳本在加載失敗時「回家」,因此您可以對服務器端的URL列表重新排序。

+0

我知道使用服務器端檢查圖像完整性可能不是一個好主意,因爲客戶端可能會有不同的結果,但是我覺得使用Javascript按順序加載圖像可能會導致不良影響。也就是說,如果首選主機突然關閉,JavaScript會花多長時間來確定該圖像不會加載並轉到下一個?用戶體驗可能會受此影響嗎?我認爲最好的解決方案是使用PHP來檢查可用圖像,然後使用JavaScript嘗試按順序加載每個圖像。 – bvpx

+0

@Eugene提出的這兩個選擇定義了目的:您的網站是否將圖像服務作爲主要活動提供?那麼你應該管理哪些網站使用服務器端。你擁有所有的圖像網站?那麼你應該使用負載平衡路由器,而不是客戶端代碼來獲得更好的性能。你的網站的目標是什麼? – Papasmile

+0

該網站將是一個社區,用戶可以創建一個圖片微博(有點像tumblr)。使用API​​(imgur,flickr,yfrog等)將圖像上傳到外部免費圖像網站。 「負載平衡路由器」是什麼意思? – bvpx