2011-10-07 2 views
27

Je dois vérifier si un fichier particulier existe sur un serveur distant. L'utilisation de is_file() et file_exists() ne fonctionne pas. Des idées comment faire cela rapidement et facilement?Comment vérifier si un fichier existe à partir d'une URL

+0

pourquoi ne pas travailler ??? – JellyBelly

+3

Vous pouvez utiliser cette fonction getimagesize ("url"); . Ref: http://php.net/manual/fr/fonction.getimagesize.php – InventorX

Répondre

49

vous devez utiliser CURL

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

cela fonctionne bien vous avez une ligne de faute de frappe 1 functon devrait être fonction –

+0

Vous n'avez pas besoin de CURL pour cela ... trop de frais généraux ... vérifiez ma réponse ci-dessous (utilisez get_headers de PHP pour cela!) – patrick

+1

comme les autres c'est aussi, ne vérifiant pas si c'est un fichier ou non, il suffit de vérifier l'URL. 'echo is_url_exists ('http://stackoverflow.com')? «Oui»: «Non», «fait écho» Oui. –

1

Effectuez une requête avec curl et vérifiez si elle renvoie un code d'état 404. Faites la demande en utilisant la méthode de demande HEAD pour qu'elle ne renvoie que les en-têtes sans corps.

13

Je viens de trouver cette solution:

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

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

+0

Voulez-vous dire 'getimagesize'? Comme ici: http://uk1.php.net/getimagesize si oui, les docs disent qu'il peut référencer des fichiers locaux ou distants. – Todd

+0

Oui, corrigé. Merci! –

+2

getimagesize est beaucoup trop lourd. Si vous voulez juste savoir si un fichier existe, utilisez PHP get_header (vérifiez ma réponse) – patrick

45

Vous n'avez pas besoin CURL pour ça ... Trop beaucoup de frais généraux pour juste vouloir vérifier si un fichier existe ou pas ...

Utilisez PHP's get_header.

$headers=get_headers($url); 

Vérifiez ensuite si le résultat $ [0] contient 200 OK (ce qui signifie que le fichier est là)

Une fonction pour vérifier si une des œuvres d'URL peuvent être ceci:

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

'Par défaut, get_headers utilise une requête GET pour récupérer les en-têtes' le surcoût d'une requête de curl (pas vraiment sûr de ce que cela signifie) - il y a un gaspillage de requête GET qui fait chuter le corps - au lieu d'utiliser une requête HEAD et de ne recevoir que les en-têtes. – AD7six

+1

@ AD7six: Je supposais que la configuration de cURL en mémoire causerait une surcharge, j'ai fait quelques tests comparant les deux méthodes et vous avez raison: si vous avez la bibliothèque cURL chargée, il est toujours plus rapide d'utiliser la méthode acceptée par get_headers. J'ai comparé les 3 méthodes mentionnées: cURL est le plus rapide, puis get_headers, puis getimagesize avec l'inconvénient ajouté getimagesize ne vous dira que si une image existe. C'est ce qui a été demandé, donc c'est toujours une réponse valable ici, mais ce n'est pas très polyvalent. – patrick

+1

@ ad7six Êtes-vous sûr que get_headers demande le corps? fyi, vous pouvez remplacer la requête GET via le contexte de flux: stream_context_set_default (['http' => ['method' => 'HEAD']]); $ headers = get_headers ('http://example.com'); – Tobias

3

Salut selon notre test entre 2 serveurs différents les résultats sont les suivants:

en utilisant curl pour vérifier 10 fichiers .png (chacun environ 5 mb) était en moyenne 5,7 secondes. en utilisant la vérification de l'en-tête pour la même chose a pris en moyenne 7,8 secondes! Donc, dans notre test, le curl était beaucoup plus rapide si vous deviez vérifier des fichiers plus volumineux!

notre fonction boucle est:

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; 
} 

Voici notre échantillon de contrôle d'en-tête:

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