You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
information-system/application/libraries/html_optimize_lib.php

140 lines
5.4 KiB
PHTML

<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
/*
* HTML的优化处理的类库
*/
class html_optimize_lib
{
var $CI;
public function __construct()
{
$this->CI = &get_instance();
$this->CI->load->model('Information_model');
$this->CI->load->model('InfoMetas_model');
$this->CI->load->library('simple_html_dom_lib');
}
//开启了延迟加载
public function set_lazy_loader($html, $grey_pic)
{
$html_object = str_get_html($html);
foreach ($html_object->find('img') as $image) {
$img_src = $image->src;
/**有些图片不需要延迟加载比如头部第一张图延迟加载会影响CLS的评分所以图片加loader="nolazy"属性就可以不用替换为延迟加载代码。 */
$loader = $image->loader;
if (!empty($loader) && $loader == "nolazy") {
continue;
}
/** 无需延迟加载结束 20210527 zp */
if (!empty($image->originalsrc)) {
$img_src = $image->originalsrc;
}
$image->src = $grey_pic;
$image->loader = 'lazy';
$image->originalsrc = $img_src;
}
return $html_object->save();
}
//获取图片尺寸,$lazy_loader是否开启延迟加载
public function set_image_size($html)
{
$html_object = str_get_html($html);
//拼接图片链接,获取尺寸
$request_size = array();
foreach ($html_object->find('img') as $image) {
$img_src = $image->src;
if (!empty($image->originalsrc)) {
$img_src = $image->originalsrc;
}
//图片已经设置了尺寸的不再修改
if (empty($image->width) && (strpos($img_src, '//data.') !== false || strpos($img_src, '//images.') !== false)) {//以data或者images开头的域名才能获取尺寸
$img_src_urls = parse_url(trim($img_src));
$request_size[$img_src_urls['host']][] = $img_src_urls['path'];
}
}
//请求图片尺寸
$image_sizes = array();
foreach ($request_size as $host => $path) { //拼接的URL有长度限制大量的图片一次性请求就会失败需要分批处理
$parse_url = "https://{$host}/imagesize.php?photo=" . implode(',', $path);
$size_data = GET_HTTP($parse_url);
if (!empty($size_data)) {
$size_data = json_decode($size_data);
foreach ($size_data as $size_item) {
$size_item->photo = "https://" . $host . $size_item->photo;//这个作为索引找到对应url的尺寸
$image_sizes[$size_item->photo] = $size_item;
}
}
}
//print_r($request_size);
//print_r($image_sizes);
//把尺寸写入html内容中
foreach ($html_object->find('img') as $image) {
$img_src = $image->src;
if (!empty($image->originalsrc)) {
$img_src = $image->originalsrc;
}
//图片已经设置了尺寸的不再修改
if (empty($image->width) && (strpos($img_src, '//data.') !== false || strpos($img_src, '//images.') !== false)) {//以data或者images开头的域名才能获取尺寸
$img_src_urls = parse_url(trim($img_src));
$img_index = "https://" . $img_src_urls['host'] . $img_src_urls['path'];
if (!empty($image_sizes[$img_index])) {
$image->width = $image_sizes[$img_index]->width;
$image->height = $image_sizes[$img_index]->height;
}
}
}
return $html_object->save();
}
//获取图片尺寸的本地版本,图片存在相同服务器上,速度比较快
//$dataPath data文件夹本地路径
//$imagesPath images文件夹本地路径
public function set_image_size_local($html, $dataPath, $imagesPath)
{
$html_object = str_get_html($html);
foreach ($html_object->find('img') as $image) {
$img_src = $image->src;
if (!empty($image->originalsrc)) {
$img_src = $image->originalsrc;
}
//图片已经设置了尺寸的不再修改
if (empty($image->width) && (strpos($img_src, '//data.') !== false || strpos($img_src, '//images.') !== false)) {//以data或者images开头的域名才能获取尺寸
$img_src_urls = parse_url(trim($img_src));
$request_size[$img_src_urls['host']][] = $img_src_urls['path'];
$file_path = '';
if (strpos($img_src, '//data.') !== false) {
$file_path = $dataPath . $img_src_urls['path'];
}
if (strpos($img_src, '//images.') !== false) {
$file_path = $imagesPath . $img_src_urls['path'];
}
if (is_file($file_path)) {
$properties = getimagesize($file_path);//获取图片属性读取失败返回false
if ($properties && !empty($properties[0]) && !empty($properties[1])) {
$image->width = $properties[0];
$image->height = $properties[1];
}
}
}
}
return $html_object->save();
}
}