Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich das Abrufen von Bildern für das Anheften im Pinterest-Stil optimieren, um ein schnelles und effizientes Laden hochauflösender Bilder sicherzustellen?

Wie kann ich das Abrufen von Bildern für das Anheften im Pinterest-Stil optimieren, um ein schnelles und effizientes Laden hochauflösender Bilder sicherzustellen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 23:27:29388Durchsuche

How can I optimize image fetching for Pinterest-style pinning to ensure fast and efficient loading of high-resolution images?

Optimieren Sie das Abrufen von Bildern für das Pinning im Pinterest-Stil

Bei der Bildpinning-Funktion von Pinterest ist das Abrufen hochauflösender Bilder für die Benutzererfahrung von entscheidender Bedeutung. Es kann jedoch ein zeitaufwändiger Prozess sein. Um dieses Problem anzugehen, ist ein effizienterer Ansatz erforderlich, um schnell Bilder zu sammeln, die den gewünschten Breiten- und Höhenanforderungen entsprechen.

Multithread-Bild-Download mit PHP

Ein schnellerer Ansatz liegt in der Nutzung paralleler Verbindungen mit der Funktion „curl_multi_init“ von PHP. Durch die Verteilung von Bild-Download-Anfragen auf mehrere Threads kann der Prozess erheblich beschleunigt werden. Dadurch werden potenzielle Bandbreitenbeschränkungen umgangen, die die Leistung beeinträchtigen können.

Vermeiden Sie HTTP GET für Bilder

Statt die Bildabmessungen direkt über HTTP-GET-Anfragen zu überprüfen, was zeitaufwändig sein kann ist es effizienter, die Bilder in ein lokales temporäres Verzeichnis herunterzuladen. Dies macht wiederholte HTTP-Verbindungen überflüssig und beschleunigt den Prozess.

Codebeispiel

<code class="php">require 'simple_html_dom.php';

$url = 'http://www.huffingtonpost.com';
$html = file_get_html($url);

$nodes = array();
$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;}</code>

Dieser erweiterte Ansatz nutzt Parallelität und minimiert HTTP-Anfragen, was zu erheblichen Zeitersparnis.

Das obige ist der detaillierte Inhalt vonWie kann ich das Abrufen von Bildern für das Anheften im Pinterest-Stil optimieren, um ein schnelles und effizientes Laden hochauflösender Bilder sicherzustellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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