Maison  >  Article  >  développement back-end  >  ## Comment récupérer efficacement des images à partir d'URL avec des seuils de dimension ?

## Comment récupérer efficacement des images à partir d'URL avec des seuils de dimension ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 05:40:29296parcourir

## How to Efficiently Fetch Images from URLs with Dimension Thresholds?

Récupération efficace d'images à partir d'URL avec des seuils de largeur et de hauteur

Problème :

Récupération d'images à partir d'une URL donnée qui répond à des exigences spécifiques en matière de largeur et de hauteur, telles que des images dont les deux dimensions sont supérieures ou égales à 200 pixels, est une tâche courante dans le développement Web. Cependant, ce processus peut prendre beaucoup de temps en utilisant les méthodes traditionnelles.

Approche actuelle :

Le code fourni parcourt tous les éléments sur l'URL donnée, récupérant les dimensions de l'image à l'aide de getimagesize(). Bien que cette approche fonctionne, son temps d'exécution peut être perceptible.

Solution proposée :

Pour accélérer le processus, envisagez ces optimisations :

  • Téléchargement d'images parallèles : Utilisez la fonction curl_multi_init pour télécharger des images simultanément. Cette technique réduit le temps de récupération global en lançant plusieurs requêtes simultanément.
  • Stockage de fichiers local : Au lieu d'exécuter getimagesize() directement sur les images à partir des URL HTTP, téléchargez-les localement et stockez-les dans un dossier temporaire. Cela évite la surcharge des requêtes HTTP pour la récupération des dimensions.

Implémentation du code :

Le code suivant présente une implémentation plus efficace qui intègre ces optimisations :

<code class="php">require 'simple_html_dom.php';
$url = 'http://www.huffingtonpost.com';
$html = file_get_html($url);
$nodes = array();
$start = microtime();
$res = array();

if ($html->find('img')) {
    foreach ($html->find('img') as $element) {
        if (startsWith($element->src, "/")) {
            $element->src = $url . $element->src;
        }
        if (!startsWith($element->src, "http")) {
            $element->src = $url . "/" . $element->src;
        }
        $nodes[] = $element->src;
    }
}

echo "<pre class="brush:php;toolbar:false">";
print_r(imageDownload($nodes, 200, 200));
echo "<h1>", microtime() - $start, "</h1>";

function imageDownload($nodes, $maxHeight = 0, $maxWidth = 0) {
    $mh = curl_multi_init();
    $curl_array = array();
    foreach ($nodes as $i => $url) {
        $curl_array[$i] = curl_init($url);
        curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl_array[$i], CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)');
        curl_setopt($curl_array[$i], CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($curl_array[$i], CURLOPT_TIMEOUT, 15);
        curl_multi_add_handle($mh, $curl_array[$i]);
    }
    $running = NULL;
    do {
        usleep(10000);
        curl_multi_exec($mh, $running);
    } while ($running > 0);

    $res = array();
    foreach ($nodes as $i => $url) {
        $curlErrorCode = curl_errno($curl_array[$i]);

        if ($curlErrorCode === 0) {
            $info = curl_getinfo($curl_array[$i]);
            $ext = getExtention($info['content_type']);
            if ($info['content_type'] !== null) {
                $temp = "temp/img" . md5(mt_rand()) . $ext;
                touch($temp);
                $imageContent = curl_multi_getcontent($curl_array[$i]);
                file_put_contents($temp, $imageContent);
                if ($maxHeight == 0 || $maxWidth == 0) {
                    $res[] = $temp;
                } else {
                    $size = getimagesize($temp);
                    if ($size[1] >= $maxHeight && $size[0] >= $maxWidth) {
                        $res[] = $temp;
                    } else {
                        unlink($temp);
                    }
                }
            }
        }
        curl_multi_remove_handle($mh, $curl_array[$i]);
        curl_close($curl_array[$i]);

    }

    curl_multi_close($mh);
    return $res;
}

function getExtention($type) {
    $type = strtolower($type);
    switch ($type) {
        case "image/gif":
            return ".gif";
            break;
        case "image/png":
            return ".png";
            break;

        case "image/jpeg":
            return ".jpg";
            break;

        default:
            return ".img";
            break;
    }
}

function startsWith($str, $prefix) {
    $temp = substr($str, 0, strlen($prefix));
    $temp = strtolower($temp);
    $prefix = strtolower($prefix);
    return ($temp == $prefix);
}</code>

Avantages :

  • Le code optimisé réduit considérablement le temps de récupération par rapport à l'approche originale.
  • Il utilise le téléchargement parallèle à l'aide de curl_multi_init, améliorant l'efficacité.
  • La stratégie de stockage de fichiers locaux permet de gagner du temps en évitant les requêtes HTTP répétées pour la récupération des dimensions.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn