2011-10-07 181 views
27

我需要檢查一個特定的文件是否存在於遠程服務器上。使用is_file()file_exists()不起作用。任何想法如何快速輕鬆地做到這一點?如何檢查一個文件是否存在從一個url

+0

爲什麼不行??? – JellyBelly

+3

你可以使用這個函數getimagesize(「url」); 。 Ref:http://php.net/manual/en/function.getimagesize.php – InventorX

回答

49

,你必須使用捲曲

function is_url_exist($url){ 
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_exec($ch); 
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

    if($code == 200){ 
     $status = true; 
    }else{ 
     $status = false; 
    } 
    curl_close($ch); 
    return $status; 
} 
+1

它工作正常,你有一個錯字行1功能應該是功能 –

+0

你不需要CURL的... ...太多的開銷...檢查下面的答案(使用PHP的get_headers這個!) – patrick

+1

像其他人一樣,它不是檢查它是否是文件,只是檢查URL。 'echo is_url_exists('http://stackoverflow.com')? '是':'不';'回顯'是'。 –

1

用curl做一個請求,看它是否返回一個404狀態碼。使用HEAD請求方法執行請求,以便僅返回沒有正文的標題。

13

我只是發現這個解決方案:

if(@getimagesize($remoteImageURL)){ 
    //image exists! 
}else{ 
    //image does not exist. 
} 

來源:http://www.dreamincode.net/forums/topic/11197-checking-if-file-exists-on-remote-server/

+0

這對我來說並不適用,你的意思是'getimagesize'嗎?如下所示:http://uk1.php.net/getimagesize如果是這樣的話,文檔說它可以引用本地或遠程文件。 – Todd

+0

是的,已更正。謝謝! –

+2

getimagesize是太多的開銷。如果你只是想知道一個文件是否存在,請使用PHP的get_header(檢查我的答案) – patrick

45

你不需要捲曲爲......太只是想檢查一個文件是否存在或許沒有太多的開銷...

使用PHP's get_header

$headers=get_headers($url); 

然後檢查$結果[0]包含200 OK(這意味着該文件是存在的)

一個函數來檢查URL的作品可能是這樣的:

function UR_exists($url){ 
    $headers=get_headers($url); 
    return stripos($headers[0],"200 OK")?true:false; 
} 

/* You can test a URL like this (sample) */ 
if(UR_exists("http://www.amazingjokes.com/")) 
    echo "This page exists"; 
else 
    echo "This page does not exist"; 
+1

'默認情況下,get_headers使用GET請求來獲取頭文件 - curl請求的開銷(並不確定引用的開銷是多少) - 存在一個浪費的GET請求,它會丟棄正文 - 而不是使用HEAD請求,只接收頭。 – AD7six

+1

@ AD7six:我假設在內存中設置cURL會導致重載,我做了一些比較這兩種方法的測試,並且您是對的:如果您加載了cURL庫,那麼與get_headers相比,使用接受的方法始終更快。我比較了所有提到的3種方法:cURL是最快的,然後get_headers,然後getimagesize與增加的缺點getimagesize只會告訴你,如果圖像存在。這是被問到的,所以這裏仍然是一個有效的答案,但它不是很通用。 – patrick

+1

@ ad7six你確定get_headers正在請求正文? fyi,你可以通過流上下文覆蓋GET請求: stream_context_set_default(['http'=> ['method'=>'HEAD']]); $ headers = get_headers('http://example.com'); – Tobias

3

喜根據我們在2臺不同服務器之間的測試,結果如下:

使用curl檢查10個.png文件(每個大約5mb)平均爲5.7秒。 使用標題檢查相同的東西平均需要7.8秒!

因此,在我們的測試中,如果您必須檢查較大的文件,捲曲速度會更快!

我們的捲曲的功能是:

function remote_file_exists($url){ 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_exec($ch); 
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    if($httpCode == 200){return true;} 
    return false; 
} 

這裏是我們的頭檢查樣本:

function UR_exists($url){ 
    $headers=get_headers($url); 
    return stripos($headers[0],"200 OK")?true:false; 
} 
相關問題