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?
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!