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

Linda Hamilton
Libérer: 2024-10-27 05:40:29
original
294 Les gens l'ont consulté

## 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!