2012-03-30 67 views
2

我有超過5000個圖像鏈接,我需要找到一種方法來檢查它們是否存在。我用getimagesize(),但花了太長時間。速度對我至關重要。PHP:檢查圖像是否存在(方法)

我寫了一個小函數,但它不工作,我不知道爲什麼。

function img_exists($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    if(curl_exec($ch)) 
     return true; 
    else 
     return false; 

    curl_close($ch); 
} 

目前我正在使用PHP進行檢查。請讓我知道是否有更好的解決方案。

請注意,如果連接超時(1秒),則函數返回false。速度至關重要。

更新:文件位於不同的服務器上。

+0

的圖像是遠程或此腳本正在同一主機空間運行圖像?如果是這樣,可以使用'file_exists()' – RedactedProfile 2012-03-30 21:02:17

回答

4

如果可以,curl_multi_*函數應該使整個過程更快,請檢查manual

而且,只是在做一個HEAD請求(而不是GET)會爲你節省相當長的一段字節/次,補充一點:

curl_setopt_array($ch, array(CURLOPT_HEADER => true, CURLOPT_NOBODY => true)); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); 
+0

如果你不想看到HEAD結果,添加curl_setopt($ ch,CURLOPT_RETURNTRANSFER,1); – Acyra 2016-02-27 17:10:06

2

如果你有赤自己的服務器上的文件,你可以簡單地使用file_exists() - 如果你需要檢查遠程文件並已啓用allow_url_fopen,你可以使用fopen()這樣的:

function url_exists($path){ 
    return (@fopen($path,"r")==true); 
} 

一個小紙條到你的函數中:你在返回一個值之後試圖調用curl_close(),所以這個語句是無意義的,因爲它永遠不會被達到(並且可能會導致內存泄漏,因爲你永遠不會關閉流)。

+0

你可以添加一個自定義超時fopen? – haltabush 2012-03-30 21:12:53

+1

@haltabush你可以超時fsockopen – safarov 2012-03-30 21:14:00