Heim  >  Artikel  >  Backend-Entwicklung  >  So optimieren Sie Bilder, um Breite und Höhe in PHP zu erhalten

So optimieren Sie Bilder, um Breite und Höhe in PHP zu erhalten

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-06-18 17:26:182288Durchsuche

In diesem Artikel erfahren Sie, wie Sie die Breite und Höhe von PHP-optimierten Bildern ermitteln. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

So optimieren Sie Bilder, um Breite und Höhe in PHP zu erhalten

php Bezüglich der Optimierung der Bilderfassungsbreite und -höhe

Anforderungen

Als Reaktion auf Frontend-Anforderungen müssen bei der Eingabe der Artikeldetails alle Bilder durch Platzhalter ersetzt werden, und die Platzhalter benötigen um den Bildinformationen zu entsprechen (hauptsächlich müssen Breite und Höhe bekannt sein)

Zweck: Beim Klicken auf das Bild einen schwebenden Fenstereffekt erzeugen

Implementierungsplan

vor der Optimierung

Ordnen Sie regelmäßig Bilder zu und führen Sie dann eine Schleife durch, um die Breite und Höhe jedes Bildes zu ermitteln.

Problem: Wenn der Artikel weniger Bilder enthält, ist der obige Vorgang kein großes Problem. Sobald jedoch zu viele Bilder vorhanden sind, ist die Effizienz sehr gering

Der Code lautet wie folgt:

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

            }
        }

Optimierungsideen

Ich frage mich, ob es eine Möglichkeit gibt, schnell Bilder zu erhalten? Ich habe im Internet einige Informationen gefunden, die im Grunde genommen einen Teil der Dateiinformationen des Bildes lesen, ohne das gesamte Bild herunterzuladen/zu lesen. Ich habe eine Klassenbibliothek gefunden: [https://github.com/tommoor/fastimage](https://github.com/tommoor/fastimage) und habe es ausprobiert. Im Vergleich zur vorherigen Idee (vollständiger Download von Bildern) gibt es tatsächlich eine Leistungsverbesserung. Interessierte Freunde können es versuchen. Wenn Sie Informationen aus einem einzelnen Bild erhalten möchten, ist dies dennoch sehr zu empfehlen. Bei der Analyse der oben genannten Vorgänge scheint die Batch-Implementierung jedoch nicht möglich zu sein. Tatsächlich sollte der langsame Prozess immer noch in der Schleife bleiben, um Bildressourcen zu erhalten. Denken wir mal anders darüber nach: Ist es in Ordnung, wenn ich Bilder in Stapeln erhalte? Up the 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. Testen Sie die Leistung, die Effizienz von 20 Bildern kann fast die zweite Stufe erreichen

![Bild](/img/bVcKCF2)

Empfohlenes Lernen:

php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo optimieren Sie Bilder, um Breite und Höhe in PHP zu erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen