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.
php Bezüglich der Optimierung der Bilderfassungsbreite und -höhe
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
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('/<img.*? src="(.*?)".*?>/is', $str, $matchs); if(!empty($matchs[0])){ $pics = []; $i = 0; foreach ($matchs[0] as $key => $m) { $fileInfo = file_get_contents($matchs[1][$key] . '?x-oss-process=image/info'); $fileInfo = json_decode($fileInfo, true); $data['Width'] = $fileInfo['ImageWidth']['value']; $data['Height'] = $fileInfo['ImageHeight']['value']; $imgs[$i]['ref'] = '<!--IMG#' . $key . '-->'; $imgs[$i]['pixel'] = $data['Width'] . '*' . $data['Height']; preg_match('/alt="(.*?)"/i', $matchs[0][$key], $mt); $imgs[$i]['alt'] = isset($mt[1]) ? $mt[1] : ''; //图片alt $imgs[$i]['src'] = $matchs[1][$key]; //图片地址 $str = str_replace($m, '<!--IMG#' . $key . '-->', $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('/<img.*? src="(.*?)".*?>/is', $str, $matchs); if(!empty($matchs[0])){ //$time = microtime(true); //echo ' ---- start ' . PHP_EOL; foreach ($matchs[0] as $key => $m) { $urls[] = $matchs[1][$key] . '?x-oss-process=image/info'; } $imageInfos = batchCurl($urls); $i = 0; foreach ($matchs[0] as $key => $m) { $image = json_decode($imageInfos[$key], true); $_img['Width'] = $width= $image['ImageWidth']['value']; $_img['Height'] = $height = $image['ImageHeight']['value']; $imgs[$i]['ref'] = '<!--IMG#' . $key . '-->'; $imgs[$i]['pixel'] = $_img['Width'] . '*' . $_img['Height']; preg_match('/alt="(.*?)"/i', $matchs[0][$key], $mt); $imgs[$i]['alt'] = isset($mt[1]) ? $mt[1] : ''; //图片alt $imgs[$i]['src'] = $matchs[1][$key]; //图片地址 $str = str_replace($m, '<!--IMG#' . $key . '-->', $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-TutorialDas 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!