FrankenPHP打包体积大主因是未清理开发残留和冗余依赖,而非压缩算法;需删除.git、tests/、docs/、vendor/bin/等目录,清空storage/缓存日志,精简public/静态资源,并用composer install --no-dev --optimize-autoloader优化自动加载。

FrankenPHP 打包后文件大,核心原因是没做应用精简和依赖裁剪,不是压缩算法问题;UPX 压缩只是锦上添花,源头清理才能砍掉 30%–60% 体积。
打包前必须删掉这些目录和文件
FrankenPHP 构建时会把当前目录下所有内容(包括隐藏文件)打包进二进制,未清理的开发残留会直接膨胀体积:
-
.git目录:通常占几 MB 到几十 MB,git archive或rsync -a --exclude='.git'更安全 -
tests/、docs/、examples/:纯文档或测试代码,生产完全无用 -
vendor/bin/:Composer 的可执行脚本(如phpunit、phpcs),composer install --no-dev不会删它,需手动rm -rf vendor/bin -
storage/logs/、storage/framework/cache/、storage/framework/views/:缓存和日志目录必须为空,否则可能打包进旧日志或已编译视图 -
public/mix-manifest.json(Laravel)或public/build/(Symfony Encore):若前端已构建完成,保留public/js/和public/css/即可,manifest 文件非必需
依赖安装必须加 --no-dev 和 --optimize-autoloader
不加这两个参数,vendor 里会多出大量 dev-only 包(如 phpunit/phpunit、symfony/debug-bundle),且自动加载器是未优化的散列映射,启动慢、体积大:
- 运行
composer install --no-dev --optimize-autoloader --ignore-platform-reqs(后者防跨平台构建失败) - 确认
vendor/autoload.php中的ClassLoader::loadClass()调用路径变短,类映射数组更紧凑 - 检查
vendor/composer/autoload_classmap.php是否存在且非空——这是优化生效的关键标志 - 若用 Symfony,额外跑
composer dump-env prod,它会把.env编译进var/cache/prod/App_KernelProdContainer.php,避免运行时读取文件
--no-compress 不等于“不压缩”,而是跳过 UPX 阶段
frankenphp build 默认启用 UPX 压缩,但某些扩展(如 openssl、gd)或静态链接的 C 库会导致 UPX 失败或解压异常;此时加 --no-compress 反而让二进制更大,应先排查根本原因:
立即学习“PHP免费学习笔记(深入)”;
- 先用
frankenphp build --output app --server-name example.com --no-compress构建无压缩版,再手动试 UPX:upx --best --lzma app - 若报
upx: app: CantPackException: load segment address overlap,说明 PHP 扩展或自定义php.ini加载了冲突模块,需精简extension=行 - Linux 下推荐用 UPX 4.2+(2025 年后版本),对 Go + PHP 混合二进制兼容性更好;macOS 用户注意 Apple Silicon 需用
upx --arm64 - 实测:一个 Laravel 应用从 86MB(无压缩)→ 41MB(UPX 默认)→ 33MB(
--lzma),但前提是源码已按前述步骤清理干净
容易被忽略的体积黑洞:public/ 下的静态资源
很多人以为 FrankenPHP 只打包 PHP 代码,其实 public/ 全目录都会进二进制——高清图片、未压缩 JS/CSS、字体文件会悄悄吃掉几十 MB:
- 检查
public/下是否有.psd、.ai、.mov等非 Web 资源,全部移出 - 用
find public/ -type f -size +500k -exec ls -lh {} \;找出大文件,针对性压缩(如svgo压 SVG,jpegoptim压 JPG) - Webpack/Vite 构建产物建议启用
build.minify: 'terser'和build.cssCodeSplit: true,避免单个 JS 超过 5MB - 若用 Tailwind CSS,确认
content配置精准,避免扫描全项目导致生成冗余 CSS
真正有效的精简不是靠 UPX 多压几MB,而是让 FrankenPHP 打包时“看到的”东西本身就少——删什么、装什么、放什么,每一步都得在构建命令执行前完成。一旦二进制生成,就只能重来。



















