使用 box-project/box 可将 Composer 项目打包为独立 Phar 文件,核心是通过配置 box.json 指定入口脚本(main)、自动加载器(autoloader)及源码目录,Box 自动嵌入依赖、重写类加载、压缩并注入 stub,最终生成可执行的 myapp.phar。

用 box-project/box 把 Composer 项目打包成独立 Phar 文件,核心是让所有依赖、自动加载和入口脚本全部内聚进一个可执行文件里,不依赖外部 vendor 目录。
安装 Box 工具
Box 是目前最成熟、维护活跃的 Phar 打包工具,推荐用 Composer 全局安装:
-
composer global require humbug/box(确保
~/.composer/vendor/bin在系统 PATH 中) - 或者项目内安装:composer require --dev humbug/box,然后通过
vendor/bin/box调用
准备项目结构与入口文件
Box 要求明确指定一个“主执行脚本”(如 bin/myapp),它必须能直接运行,并且不依赖外部 autoloader 初始化 —— 因为 Phar 内部会自己处理。
- 入口脚本开头加 shebang:#!/usr/bin/env php
- 手动引入 Composer 自动加载器:require 'vendor/autoload.php';(Box 会把 vendor/autoload.php 和所有依赖重写进 Phar)
- 确保该脚本有可执行权限(Linux/macOS 下
chmod +x bin/myapp)
配置 box.json
在项目根目录放 box.json(或 box.json.dist),关键字段示例:
{
"main": "bin/myapp",
"output": "myapp.phar",
"chmod": "0755",
"compression": "GZ",
"stub": true,
"alias": "myapp.phar",
"directories": ["src", "bin"],
"files": ["LICENSE"],
"autoloader": "vendor/autoload.php",
"exclude-composer-files": true
}
-
main必须指向你的入口脚本路径(相对于项目根) -
autoloader告诉 Box 哪个 autoload.php 需要被重写并嵌入 -
directories列出要打包的源码目录;files可追加额外文件(如 LICENSE) -
stub: true表示生成标准 Phar stub(含 __HALT_COMPILER();)
构建并验证 Phar
运行打包命令:
- box compile(使用默认配置)
- 或指定配置:box compile --config box.json
成功后生成 myapp.phar。验证是否可用:
- 加执行权限:chmod +x myapp.phar
- 直接运行:./myapp.phar --version 或 php myapp.phar
- 检查签名(如果启用了签名):php -r "echo file_get_contents('myapp.phar') === '' ? 'ok' : 'broken';"
基本上就这些。关键点是入口脚本要自包含、配置里明确 autoloader 和 main,Box 会自动处理类重映射、压缩、签名和 stub 注入。不复杂但容易忽略入口脚本的 require 和权限设置。










