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.
php Optimisation de la largeur et de la hauteur d'acquisition d'image
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
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('/<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++; } }
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('/<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. 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!