Box才是PHAR打包主体,Composer仅准备依赖;box必须设"install": false以禁用自动composer install,防止dev依赖混入、autoload_dev.php残留及类映射未优化,再手动执行composer install --no-dev --optimize-autoloader确保PHAR纯净高效。

不能用 composer 命令直接构建自解压 PHAR,它压根没这个功能;真正能打包、签名、生成可执行 stub 的是 box 或原生 Phar 类,composer 只负责把 autoload.php 和依赖路径准备好。
box compile 为什么必须配 "install": false
box 默认会在打包前静默执行 composer install,这会导致几个严重问题:dev 依赖被装进 PHAR、autoload_dev.php 残留、类映射未优化、甚至因本地扩展(如 xdebug)差异引发运行时崩溃。设 "install": false 是硬性开关——不是 "composer-install": false(后者无效),它关掉自动安装,把控制权交还给你。
打包前你得自己跑:
composer install --no-dev --optimize-autoloader --classmap-authoritative- 确认
vendor/composer/autoload_dev.php不存在(否则说明 dev autoloader 没清理干净) - 检查
vendor/autoload.php能独立加载:比如php -r "require 'vendor/autoload.php'; echo 'ok';"
入口脚本里 require autoload.php 的写法陷阱
开发阶段能跑的 bin/myapp,打进 PHAR 后大概率报 Class not found,原因就在这行 require 写错了。
错误写法(依赖外部路径):
box.json
-
Phar::running(true)获取当前 PHAR 文件的绝对路径(如/path/to/app.phar) - 再拼接内部路径:
Phar::running(true) . '/templates/layout.twig' - 对所有资源访问做封装,避免散落在各处的硬编码路径
如果用了 Symfony Console,初始化前加一句:Symfony\Component\Console\Application::setAutoExit(false),否则 exit() 会中断 PHAR 执行流。
stub 和 file_get_contents 自动解析 phar:// 协议的关键开关
PHAR 必须有合法 stub 才能被系统识别为可执行文件,而 box 的 "stub": true 会自动生成带 #!/usr/bin/env php 和 __HALT_COMPILER(); 的标准 stub。但仅此还不够。
如果你的代码里用了 file_get_contents('templates/config.json') 这类调用,默认不会自动转成 phar:// 协议——除非你在 stub 或入口脚本开头加:
Phar::interceptFileFuncs(true);
这个调用会让 fopen、file_get_contents、include 等函数自动识别并解析 phar:// 协议,否则资源读取会静默失败。
最后提醒一句:别指望 composer dump-autoload 或 install 能搞定打包,它们只管 autoloader;真正让 PHAR “活起来”的,是 stub、路径重定向、协议拦截这三件事,缺一不可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











