Maison  >  Article  >  développement back-end  >  Comment puis-je optimiser la récupération d'images pour l'épinglage de style Pinterest afin de garantir un chargement rapide et efficace des images haute résolution ?

Comment puis-je optimiser la récupération d'images pour l'épinglage de style Pinterest afin de garantir un chargement rapide et efficace des images haute résolution ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 23:27:29388parcourir

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

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn