PHP 怎么PHP 摇树

wen PHP项目 2

本文目录导读:

PHP 怎么PHP 摇树

  1. 使用 Composer 的自动加载优化(最常用)
  2. 使用 opcache 预加载(PHP 7.4+)
  3. 使用函数级死代码消除(需要工具)
  4. 框架级别的优化(如 Laravel)
  5. 使用 Phar 打包(极简方案)
  6. 最实用的方案

在 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 + 静态分析

通过静态分析工具(如 PsalmPhan)标记未使用的函数/方法,然后使用 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 那样在模块系统层面进行,最有效的做法是项目初期就设计合理的模块结构,配合自动化工具检查并移除冗余代码。

抱歉,评论功能暂时关闭!