Optimize Image Fetching for Pinterest-Style Pinning
In Pinterest's image pinning feature, retrieving high-resolution images is crucial for user experience. However, it can be a time-consuming process. To address this issue, a more efficient approach is needed to quickly gather images that meet the desired width and height requirements.
Multithreaded Image Download with PHP
A faster approach lies in utilizing parallel connections with PHP's curl_multi_init function. By distributing image download requests across multiple threads, the process can be significantly accelerated. This bypasses potential bandwidth limitations that can impede performance.
Avoid HTTP GET for Images
Instead of directly checking image dimensions via HTTP GET requests, which can be time-consuming, it's more efficient to download the images to a local temporary directory. This eliminates the need for repeated HTTP connections and speeds up the process.
Code Example
<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>
This enhanced approach harnesses parallelism and minimizes HTTP requests, resulting in significant time savings.
The above is the detailed content of How can I optimize image fetching for Pinterest-style pinning to ensure fast and efficient loading of high-resolution images?. For more information, please follow other related articles on the PHP Chinese website!