Maison > développement back-end > Problème PHP > Comment optimiser les images pour obtenir la largeur et la hauteur en php

Comment optimiser les images pour obtenir la largeur et la hauteur en php

醉折花枝作酒筹
Libérer: 2023-03-10 18:16:02
avant
2342 Les gens l'ont consulté

Cet article vous présentera comment obtenir la largeur et la hauteur des images optimisées en php. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment optimiser les images pour obtenir la largeur et la hauteur en php

php Optimisation de la largeur et de la hauteur d'acquisition d'image

Exigences

Devrait être Exigences frontales, lors de la saisie des détails de l'article, toutes les images doivent être remplacées par des espaces réservés, et les espaces réservés doivent correspondre aux informations de l'image (il faut principalement connaître la largeur et la hauteur)

Objectif : créer un effet de fenêtre flottante en cliquant sur l'image

Plan de mise en œuvre

Avant optimisation

Faites correspondre régulièrement les images, puis bouclez pour obtenir la largeur et la hauteur de chaque image

Problème : si l'article contient moins d'images, l'opération ci-dessus n'est pas un gros problème. Mais une fois qu'il y a trop de photos, l'efficacité sera très faible

Le code est le suivant :

        preg_match_all(&#39;/<img.*? src="(.*?)".*?>/is&#39;, $str, $matchs);
       
        if(!empty($matchs[0])){
            $pics = [];
            $i = 0;
            foreach ($matchs[0] as $key => $m) {
                $fileInfo = file_get_contents($matchs[1][$key] . &#39;?x-oss-process=image/info&#39;);
                $fileInfo = json_decode($fileInfo, true);
                $data[&#39;Width&#39;] = $fileInfo[&#39;ImageWidth&#39;][&#39;value&#39;];
                $data[&#39;Height&#39;] = $fileInfo[&#39;ImageHeight&#39;][&#39;value&#39;];
                    
                $imgs[$i][&#39;ref&#39;] = &#39;<!--IMG#&#39; . $key . &#39;-->&#39;;
                $imgs[$i][&#39;pixel&#39;] = $data[&#39;Width&#39;] . &#39;*&#39; . $data[&#39;Height&#39;];
                preg_match(&#39;/alt="(.*?)"/i&#39;, $matchs[0][$key], $mt);
                $imgs[$i][&#39;alt&#39;] = isset($mt[1]) ? $mt[1] : &#39;&#39;;   //图片alt
                $imgs[$i][&#39;src&#39;] = $matchs[1][$key];                //图片地址
                $str = str_replace($m, &#39;<!--IMG#&#39; . $key . &#39;-->&#39;, $str);
                $i++;

            }
        }
Copier après la connexion

Idées d'optimisation

Je me demande s'il existe un moyen d'obtenir des photos très vite ? J'ai trouvé des informations sur Internet, qui lisent essentiellement une partie des informations du fichier de l'image sans télécharger/lire l'intégralité de l'image. J'ai trouvé une bibliothèque de classes : [https://github.com/tommoor/fastimage](https://github.com/tommoor/fastimage) et je l'ai essayée. Par rapport à l'idée précédente (téléchargement complet des images), il y a effectivement une amélioration des performances. Les amis intéressés peuvent l'essayer. Si vous souhaitez obtenir des informations à partir d'une seule image, cela reste fortement recommandé. Mais l'implémentation par lots semble incapable d'atteindre l'objectif

En analysant les opérations ci-dessus, en fait, le processus lent devrait toujours rester dans la boucle pour obtenir des ressources d'image. Alors réfléchissons-y différemment, est-ce que je peux recevoir des photos par lots ? Montez le code

preg_match_all(&#39;/<img.*? src="(.*?)".*?>/is&#39;, $str, $matchs);

if(!empty($matchs[0])){
    //$time = microtime(true);
    //echo  &#39;  ---- start &#39; . PHP_EOL;

    foreach ($matchs[0] as $key => $m) {
        $urls[] = $matchs[1][$key] . &#39;?x-oss-process=image/info&#39;;
    }
    $imageInfos = batchCurl($urls);

    $i = 0;
    foreach ($matchs[0] as $key => $m) {
        $image = json_decode($imageInfos[$key], true);
        $_img[&#39;Width&#39;] = $width= $image[&#39;ImageWidth&#39;][&#39;value&#39;];
        $_img[&#39;Height&#39;] = $height = $image[&#39;ImageHeight&#39;][&#39;value&#39;];

        $imgs[$i][&#39;ref&#39;] = &#39;<!--IMG#&#39; . $key . &#39;-->&#39;;
        $imgs[$i][&#39;pixel&#39;] = $_img[&#39;Width&#39;] . &#39;*&#39; . $_img[&#39;Height&#39;];
        preg_match(&#39;/alt="(.*?)"/i&#39;, $matchs[0][$key], $mt);
        $imgs[$i][&#39;alt&#39;] = isset($mt[1]) ? $mt[1] : &#39;&#39;;   //图片alt
        $imgs[$i][&#39;src&#39;] = $matchs[1][$key];                //图片地址
        $str = str_replace($m, &#39;<!--IMG#&#39; . $key . &#39;-->&#39;, $str);

        $i++;
    }
    //echo  " ---- end  px in " . (microtime(true)-$time) . " seconds \n";
    //exit;
}
        
function batchCurl($urls)
{
    $res = $conn = [];

    // 创建批处理cURL句柄
    $mh = curl_multi_init();

    foreach ($urls as $i => $url) {
        // 创建一对cURL资源
        $conn[$i] = curl_init();
        // 设置URL和相应的选项
        curl_setopt($conn[$i], CURLOPT_URL, $url);
        curl_setopt($conn[$i], CURLOPT_HEADER, 0);
        curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($conn[$i], CURLOPT_TIMEOUT, 10);
        // 302跳转
        curl_setopt($conn[$i], CURLOPT_FOLLOWLOCATION, 1);
        // 增加句柄
        curl_multi_add_handle($mh, $conn[$i]);
    }
    $active = null;
    //防卡死写法:执行批处理句柄
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    while ($active && $mrc == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            do {
                $mrc = curl_multi_exec($mh, $active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }
    foreach ($urls as $i => $url) {
        //获取当前解析的cURL的相关传输信息
        $info = curl_multi_info_read($mh);
        //获取请求头信息
        $heards = curl_getinfo($conn[$i]);
        //获取输出的文本流
        $res[$i] = curl_multi_getcontent($conn[$i]);
        // 移除curl批处理句柄资源中的某个句柄资源
        curl_multi_remove_handle($mh, $conn[$i]);
        //关闭cURL会话
        curl_close($conn[$i]);
    }
    //关闭全部句柄
    curl_multi_close($mh);

    return $res;
}
Copier après la connexion

3. Testez les performances, l'efficacité de 20 images peut presque atteindre le deuxième niveau

![image](/img/bVcKCF2)

Recommandé apprentissage :tutoriel vidéo php

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!

Étiquettes associées:
php
source:segmentfault.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal