## Wie kann ich Bilder effizient von URLs mit Dimensionsschwellenwerten abrufen?

Linda Hamilton
Freigeben: 2024-10-27 05:40:29
Original
376 Leute haben es durchsucht

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

Effizientes Abrufen von Bildern von URLs mit Breiten- und Höhenschwellenwerten

Problem:

Bilder abrufen von einer bestimmten URL, die bestimmte Breiten- und Höhenanforderungen erfüllen, z. B. Bilder, deren beide Abmessungen größer oder gleich 200 Pixel sind, ist eine häufige Aufgabe in der Webentwicklung. Allerdings kann dieser Prozess mit herkömmlichen Methoden zeitaufwändig sein.

Aktueller Ansatz:

Der bereitgestellte Code durchläuft alle Elemente auf der angegebenen URL, wobei die Bildabmessungen mit getimagesize() abgerufen werden. Obwohl dieser Ansatz funktioniert, kann die Ausführungszeit spürbar sein.

Vorgeschlagene Lösung:

Um den Prozess zu beschleunigen, ziehen Sie die folgenden Optimierungen in Betracht:

  • Paralleler Bild-Download: Nutzen Sie die Funktion „curl_multi_init“, um Bilder gleichzeitig herunterzuladen. Diese Technik reduziert die Gesamtabrufzeit, indem mehrere Anfragen gleichzeitig initiiert werden.
  • Lokale Dateispeicherung: Anstatt getimagesize() direkt auf den Bildern von HTTP-URLs auszuführen, laden Sie sie lokal herunter und speichern Sie sie in einem temporärer Ordner. Dadurch wird der Overhead von HTTP-Anfragen für den Dimensionsabruf vermieden.

Code-Implementierung:

Der folgende Code stellt eine effizientere Implementierung dar, die diese Optimierungen beinhaltet:

<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>
Nach dem Login kopieren

Vorteile:

  • Der optimierte Code reduziert die Abrufzeit im Vergleich zum ursprünglichen Ansatz erheblich.
  • Es nutzt paralleles Herunterladen mit curl_multi_init, Verbesserung der Effizienz.
  • Die lokale Dateispeicherstrategie spart Zeit, indem wiederholte HTTP-Anfragen zum Abrufen von Dimensionen vermieden werden.

Das obige ist der detaillierte Inhalt von## Wie kann ich Bilder effizient von URLs mit Dimensionsschwellenwerten abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage