2017-10-11 108 views
0

我目前有一個腳本,它使用curl來檢查每次用戶訪問頁面時大約3000個圖像的文件大小。這是因爲每次內容可能會改變。PHP比curl更快檢查遠程圖像文件大小約3000倍?

如果它匹配7442字節的大小,它會更改圖像的路徑,如果不是,則保持它的源。

圖像URL存儲在$ variable,mysql以及遠程和本地xml文件中。但圖像自身總是遠程存儲。

$image = 'http://remoteserver.com/user22.jpg'; 
//Check if all thumbs are ok real and available 
$ch = curl_init($image); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_NOBODY, TRUE); 

$data = curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
curl_close($ch); 
if($size == 7442){ 
    echo '<img src="https://www.newdomain.com/tmp.jpg" height="190.11"/></a>'; 
} else { 
    echo '<img src="' . $image . '" alt="' . $user . '" /></a>'; 
} 

當它被激活時,頁面大約需要40秒加載,當它被註釋掉時,它需要3秒鐘。但是每次用戶訪問網頁時都會執行該操作,或者如果在向mysql添加數據並在mysql中更改地址之前執行curl操作,會導致將該信息加載到該mysql的大量延遲,從而無法顯示所有圖像。

我知道有很多取決於這個檢查,這兩個服務器響應時間,PHP配置等等..但我真的需要這個圖像文件檢查工作,並且不能有40秒的加載時間每次用戶訪問該頁面。

任何建議/幫助?謝謝

+3

將其作爲後臺進程運行,而不是作爲Web請求的一部分 –

+1

您可以使用memcache或其他方式來存儲圖像URL重新路由的集合。定期後臺服務(PHP腳本)可以定期運行以檢查文件大小並將重新路由的URL添加到memcache。您可以獲取在memcache中查找的函數的圖像URL,如果找到則返回鍵,否則返回原始URL。 – jcorry

+0

謝謝Mark Ba​​ker和Jcorry。原來的url實際上存儲在mysql中,但只有url,沒有大小信息。這將消除對memcache的需求? –

回答

0

正如其他人在評論中提出的建議,我會創建一個後臺進程來檢查文件大小並更新與請求完全分開的mysql。如果多個用戶請求相同的圖像,這將更有效率。

但是,如果真的需要在頁面加載時完成,另一個更好的用戶體驗選擇是從瀏覽器進行檢查。使用存儲的圖像路徑加載頁面,然後使用JS請求文件大小並根據需要更改圖像路徑。例如。

var images = document.getElementsByTagName('img'); 
for(var i = 0; i < images.length; i++) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("HEAD", images[i].src, true); 
    xhr.onreadystatechange = function() { 
     if (this.readyState == this.DONE) { 
      if (parseInt(xhr.getResponseHeader("Content-Length"))) === 7442) { 
       images[i].src = 'https://www...'; // New path 
      } 
     } 
    }; 
    xhr.send(); 
} 

(未經測試,但你的想法。從another SO answer改編。)

然後當這一切都做,你可以做一個AJAX POST到你的Web應用程序更新的MySQL如果需要的話。同時請記住,這將嘗試向託管映像的服務器發出多個併發請求,因此可能會對性能產生影響。

+0

謝謝Matt,我會嘗試使用Javascript/Ajax,因爲捲曲一切似乎都失速,這可能是最好的選擇。會說點什麼a.s.a.p. –