Optimiser la récupération d'images pour l'épinglage de style Pinterest
Dans la fonction d'épinglage d'images de Pinterest, la récupération d'images haute résolution est cruciale pour l'expérience utilisateur. Cependant, cela peut prendre du temps. Pour résoudre ce problème, une approche plus efficace est nécessaire pour rassembler rapidement des images qui répondent aux exigences de largeur et de hauteur souhaitées.
Téléchargement d'images multithread avec PHP
Une approche plus rapide consiste à utiliser des connexions parallèles avec la fonction curl_multi_init de PHP. En répartissant les demandes de téléchargement d'images sur plusieurs threads, le processus peut être considérablement accéléré. Cela contourne les limitations potentielles de bande passante qui peuvent nuire aux performances.
Évitez HTTP GET pour les images
Au lieu de vérifier directement les dimensions de l'image via des requêtes HTTP GET, ce qui peut prendre du temps. , il est plus efficace de télécharger les images dans un répertoire temporaire local. Cela élimine le besoin de connexions HTTP répétées et accélère le processus.
Exemple de code
<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>
Cette approche améliorée exploite le parallélisme et minimise les requêtes HTTP, ce qui entraîne des pertes significatives. gain de temps.
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!