本文目录导读:

- 使用 Composer 的自动加载优化(最常用)
- 使用 opcache 预加载(PHP 7.4+)
- 使用函数级死代码消除(需要工具)
- 框架级别的优化(如 Laravel)
- 使用 Phar 打包(极简方案)
- 最实用的方案
在 PHP 中,“摇树优化”(Tree Shaking)通常指的是移除未使用的代码,以减小最终打包文件的体积,这与 JavaScript 生态中的摇树概念类似,但 PHP 的实现方式有所不同。
PHP 本身是动态解释型语言,没有像 Webpack、Rollup 那样的前端打包工具,但可以通过以下方式实现类似效果:
使用 Composer 的自动加载优化(最常用)
Composer 提供了 classmap 生成 和 优化自动加载 功能,可以移除未使用的类。
// composer.json
{
"autoload": {
"classmap": [
"src/"
]
}
}
执行命令:
composer dump-autoload -o # 生成优化后的 classmap composer dump-autoad -a # 生成权威类映射(性能最好)
效果:只包含项目中实际引用的类,移除未使用的类文件。
使用 opcache 预加载(PHP 7.4+)
Opcache 可以预编译并缓存常用脚本,减少文件 I/O。
; php.ini opcache.preload=/path/to/preload.php
在 preload.php 中:
// 只加载实际需要使用的类
require_once '/path/to/vendor/autoload.php';
$classes = ['App\Service\A', 'App\Service\B']; // 手动筛选需要的类
foreach ($classes as $class) {
class_exists($class); // 触发预加载
}
注意:需要手动维护类列表,不适合大型项目。
使用函数级死代码消除(需要工具)
1 PhpScoper + 静态分析
通过静态分析工具(如 Psalm、Phan)标记未使用的函数/方法,然后使用 PhpScoper 或其他工具移除。
# 安装 Psalm composer require --dev vimeo/psalm # 运行分析 vendor/bin/psalm --show-info=true
可以生成报告,人工确认后手动删除未使用的代码。
2 使用 PHP-Parser 自定义脚本
编写脚本遍历 AST(抽象语法树),移除未调用的函数/方法。
use PhpParser\NodeTraverser; use PhpParser\ParserFactory; use PhpParser\PrettyPrinter; // 解析代码、遍历 AST、移除未使用的函数节点 $traverser = new NodeTraverser(); $traverser->addVisitor(new RemoveUnusedFunctionsVisitor()); $modifiedStmts = $traverser->traverse($stmts);
框架级别的优化(如 Laravel)
Laravel 的 Blade 视图编译 和 事件发现 可以优化类加载。
# Laravel 优化 php artisan optimize php artisan event:cache php artisan route:cache php artisan view:cache
这些命令会将类映射、路由、事件等缓存到单一文件中,减少文件数量和加载时间。
使用 Phar 打包(极简方案)
将项目打包成单一 Phar 文件,只包含实际使用的文件。
# 使用 box 工具 box compile
在 box.json 中配置:
{
"directories": ["src/"],
"files": ["vendor/autoload.php"],
"blacklist": ["tests/", "docs/"]
}
最实用的方案
| 场景 | 推荐方案 |
|---|---|
| 减少包体积 | Composer classmap 优化 (composer dump-autoload -o) |
| 性能优化 | Opcache 预加载 |
| 静态分析 | Psalm 或 PHPStan 标记未使用代码 |
| 最终部署 | Phar 打包 + Composer 优化 |
核心原则:PHP 的摇树主要靠 静态分析与文件级裁剪,而非像 JS 那样在模块系统层面进行,最有效的做法是项目初期就设计合理的模块结构,配合自动化工具检查并移除冗余代码。