Maison  >  Article  >  développement back-end  >  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

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-06-18 17:26:182254parcourir

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++;

            }
        }

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;
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer