web-dev-qa-db-fra.com

Vérifiez si l'image existe sur l'URL distante

Je génère des URL dynamiques d'images pour les ISBN de livre. J'ai besoin d'un moyen fiable avec PHP pour vérifier si les images existent réellement à l'url distante. J'ai essayé différentes approches avec différentes bibliothèques PHP, curl, etc.) , mais aucun d'entre eux ne fonctionne bien, certains d'entre eux sont carrément lents. Étant donné que je dois générer (et vérifier!) environ 60 URL pour chaque livre de ma base de données, c'est un temps d'attente énorme. Des indices?

45
Cristian Cotovan
function checkRemoteFile($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    // don't download content
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    curl_close($ch);
    if($result !== FALSE)
    {
        return true;
    }
    else
    {
        return false;
    }
}

-> c'est le moyen le plus rapide si votre hôte prend en charge curl

91
dangkhoaweb

Utilisez la méthode getimagesize () comme celle-ci

$external_link = ‘http://www.example.com/example.jpg’;
if (@getimagesize($external_link)) {
echo  “image exists “;
} else {
echo  “image does not exist “;
}
51
mohsin139

Il n'y a pas de moyen "facile" ici - au minimum, vous devez générer une requête HEAD et vérifier le type de contenu résultant pour vous assurer qu'il s'agit d'une image. Cela ne tient pas compte des éventuels problèmes de référent. curl est le chemin à parcourir ici.

6
ChssPly76

Vous pouvez utiliser curl . Définissez simplement l'option curl CURLOPT_NOBODY sur true. Cela sautera les informations sur le corps et n'obtiendra que la tête (donc le code http également). Ensuite, vous pouvez utiliser le CURLOPT_FAILONERROR pour transformer tout ce processus en une vérification de type vrai/faux

4
Kevin Peno
3
timborden

Je fais cela pour mon suivi de photos immobilières ...

$im = @imagecreatefromjpeg($pathtoimg);
if($im)
  imagedestroy($im); // dont save, just ack...
elseif(!$missing[$inum])
  $img404arr[] = $inum;

Cela `` semble '' plus rapide que le téléchargement de l'image réelle, prenant environ 0,3 seconde pour chacune des images dont la moyenne est de 100k.

J'aimerais pouvoir faire une vérification d'en-tête et lire si j'obtiens un 200 contre un 404 sans rien télécharger. Quelqu'un l'a-t-il à portée de main?

2
Andrew Deal

Solution de https://www.experts-exchange.com

<?php
function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}
?>
0
Gr Brainstorm

C'est probablement un point muet à ce stade, mais cela fonctionne pour moi:

function is_webfile($webfile)
{
 $fp = @fopen($webfile, "r");
 if ($fp !== false)
  fclose($fp);

 return($fp);
}
0
ChronoFish
if(@getimagesize($remoteImageURL)){
    //image exists!
}else{
    //image does not exist.
}
0
kheengz