Home > Backend Development > PHP Tutorial > How can I optimize image fetching for Pinterest-style pinning to ensure fast and efficient loading of high-resolution images?

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

Barbara Streisand
Release: 2024-10-30 23:27:29
Original
440 people have browsed it

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

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>
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template