首页 > 后端开发 > php教程 > 如何优化 Pinterest 式固定的图像获取,以确保快速高效地加载高分辨率图像?

如何优化 Pinterest 式固定的图像获取,以确保快速高效地加载高分辨率图像?

Barbara Streisand
发布: 2024-10-30 23:27:29
原创
443 人浏览过

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

优化 Pinterest 式固定的图像获取

在 Pinterest 的图像固定功能中,检索高分辨率图像对于用户体验至关重要。然而,这可能是一个耗时的过程。为了解决这个问题,需要一种更有效的方法来快速收集满足所需宽度和高度要求的图像。

使用 PHP 进行多线程图像下载

更快的方法关键在于利用PHP的curl_multi_init函数的并行连接。通过跨多个线程分配图像下载请求,可以显着加速该过程。这绕过了可能影响性能的潜在带宽限制。

避免对图像使用 HTTP GET

而不是通过 HTTP GET 请求直接检查图像尺寸,这可能非常耗时,将图片下载到本地临时目录会更高效。这消除了重复 HTTP 连接的需要并加快了进程。

代码示例

<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>
登录后复制

这种增强的方法利用并行性并最大限度地减少 HTTP 请求,从而显着提高节省时间。

以上是如何优化 Pinterest 式固定的图像获取,以确保快速高效地加载高分辨率图像?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板