Composer没有archive命令,该命令根本不存在;Phar打包必须使用PHP内置Phar类手动构建,需显式设置stub、签名算法、压缩及路径适配,不能依赖Composer原生命令。

composer archive 命令根本不存在
Composer 官方没有 composer archive 这个命令,直接运行会报错:Command "archive" is not defined.。想用 Composer 原生命令打包 Phar 是行不通的——它不负责归档,只管依赖安装与管理。
Phar 打包必须手动调用 PHP 的 Phar 类
真正生成 Phar 文件得靠 PHP 内置的 Phar 类,配合 build-phar.php 这类脚本完成。关键点不是“怎么调 Composer”,而是“怎么安全、可复现地构建 Phar”:
-
Phar::setStub()必须显式设置启动桩(stub),否则无法执行;常见写法是__HALT_COMPILER();结尾 - 添加文件时建议用
$phar->addFromString()或$phar->addFile(),避免递归扫描引入无关文件(比如vendor/bin下的软链接) - 务必调用
$phar->setSignatureAlgorithm(Phar::SHA256),否则默认用 MD5(已被弃用且部分环境拒绝加载) - 压缩前先
$phar->compressFiles(Phar::GZ),但注意:压缩后无法直接修改内容,调试阶段建议先不压
vendor 依赖打包进 Phar 的陷阱
把 vendor/ 整体塞进 Phar 看似简单,实际极易出问题:
- 很多包含
include绝对路径或__DIR__动态拼接,进 Phar 后路径失效;需配合Phar::interceptFileFuncs()+Phar::mapPhar()重写文件函数行为 -
autoload.php不能直接 require —— 要用Phar::loadPhar('xxx.phar')加载后再require 'phar://xxx.phar/vendor/autoload.php' - Composer 自动加载器在 Phar 中默认不识别
phar://协议,需提前调用Phar::webPhar()或手动注册映射 - 二进制命令(如
phpunit)通常依赖 shebang 和 CLI 参数解析,打包后需重写入口脚本,不能只复制原文件
推荐最小可行打包流程
别试图全自动,用一个明确的 build.php 控制每一步:
立即学习“PHP免费学习笔记(深入)”;
<?php
$phar = new Phar('app.phar', 0, 'app.phar');
$phar->startBuffering(Phar::SHA256, Phar::GZ);
$phar->setStub("#!/usr/bin/env php\n<?php\nPhar::mapPhar('app.phar');\nrequire 'phar://app.phar/bin/app.php';\n__HALT_COMPILER();");
$phar->addFile('bin/app.php', 'bin/app.php');
$phar->addFile('vendor/autoload.php', 'vendor/autoload.php');
// 逐个 add vendor 下关键文件,跳过 tests/docs/.git 等
$phar->stopBuffering();
echo "Built app.phar (".filesize('app.phar')." bytes)\n";
执行前确保 phar.readonly = Off 在 php.ini 中,且当前用户有写权限。Phar 的复杂性不在打包动作本身,而在运行时路径、自动加载、扩展兼容这三块——漏掉任意一个,phar:// 就会静默失败。



















