本文目录导读:

在ThinkPHP项目中进行HTML压缩与优化,可以从以下几个方面入手:
输出缓冲压缩
在入口文件(index.php)添加压缩代码
// index.php
<?php
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
// 添加输出压缩
ob_start('html_compress');
function html_compress($content) {
$search = [
'/\>[^\S ]+/s', // 去掉标签后面的空白
'/[^\S ]+\</s', // 去掉标签前面的空白
'/(\s)+/s', // 将多个空白换成一个空格
'/<!--(.|\s)*?-->/', // 去掉HTML注释
'/\n/s', // 去掉换行符
];
$replace = [
'>',
'<',
'\\1',
'',
'',
];
$content = preg_replace($search, $replace, $content);
return $content;
}
// 注册保存函数
register_shutdown_function('ob_end_flush');
ThinkPHP配置优化
在config.php中添加配置
// application/config.php
return [
// 开启模板压缩
'tpl_cache' => true,
// 模板代码压缩
'tpl_parse_str' => [
'strip_space' => true, // 去除空格
'strip_comment' => true, // 去除注释
'strip_blank' => true, // 去除空行
],
// 页面压缩
'output_compress' => true,
// 设置输出压缩级别
'output_compress_level' => 6,
];
模板优化
使用布局模板(Template Layout)
// application/config.php
'layout_on' => true,
'layout_name' => 'layout',
// 创建布局文件
// application/view/layout.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{$title}</title>
{__CSS__}
{__JS__}
</head>
<body>
{__CONTENT__}
</body>
</html>
静态资源优化
// 在模板中使用CDN或压缩后的资源
<link rel="stylesheet" href="https://cdn.example.com/css/style.min.css">
<script src="https://cdn.example.com/js/script.min.js"></script>
// 使用版本号控制缓存
<link rel="stylesheet" href="__STATIC__/css/style.css?v={$version}">
使用中间件进行压缩
// application/http/middleware/Compress.php
namespace app\http\middleware;
class Compress
{
public function handle($request, \Closure $next)
{
$response = $next($request);
if (is_object($response) && method_exists($response, 'content')) {
$content = $response->getContent();
// 压缩HTML
$content = $this->compressHtml($content);
$response->content($content);
}
return $response;
}
private function compressHtml($content)
{
$search = [
'/\>[^\S ]+/s',
'/[^\S ]+\</s',
'/(\s)+/s',
'/<!--(.|\s)*?-->/',
];
$replace = ['>', '<', '\\1', ''];
return preg_replace($search, $replace, $content);
}
}
// 注册中间件
// application/middleware.php
return [
'app\http\middleware\Compress',
];
使用第三方压缩库
composer安装html压缩库
composer require wyrihaximus/html-compress
// 在控制器中使用
use WyriHaximus\HtmlCompress\Factory;
class Index
{
public function index()
{
// 获取输出内容
$html = $this->fetch('index');
// 压缩HTML
$compressor = Factory::construct();
$compressed = $compressor->compress($html);
return $compressed;
}
}
.htaccess或Nginx配置优化
Apache (.htaccess)
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
</IfModule>
Nginx
# 开启gzip压缩 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
完整优化示例
// 在基类控制器中添加压缩方法
class BaseController extends Controller
{
protected function compressOutput($content)
{
// 移除HTML注释
$content = preg_replace('/<!--(.*)-->/Uis', '', $content);
// 压缩连续空白
$content = preg_replace('/\s+/', ' ', $content);
// 删除换行符
$content = preg_replace('/>\s+</', '><', $content);
// 压缩CSS和JS片段
$content = preg_replace_callback('/<style[^>]*>(.*?)<\/style>/is', function($matches) {
return '<style>' . preg_replace('/\s+/', ' ', $matches[1]) . '</style>';
}, $content);
$content = preg_replace_callback('/<script[^>]*>(.*?)<\/script>/is', function($matches) {
return '<script>' . preg_replace('/\s+/', ' ', $matches[1]) . '</script>';
}, $content);
return $content;
}
// 在继承的控制器中调用
protected function fetch($template = '', $vars = [], $config = [])
{
$content = parent::fetch($template, $vars, $config);
return $this->compressOutput($content);
}
}
注意事项
- 不要过度压缩:压缩会牺牲一定的可读性,建议保留必要的换行和空格
- 排除特定区域:可以使用条件注释或特殊注释标记来排除不需要压缩的区域
- 性能权衡:考虑压缩带来的CPU开销与带宽节省之间的平衡
- 测试兼容性:压缩后要确保所有浏览器正常渲染
优化效果可以降低页面体积,提高加载速度,建议根据项目实际情况选择合适的压缩策略。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播