Composer本身不提供元数据备份功能,必须手动归档composer.json和composer.lock(二者缺一不可),推荐使用tar -czf命令生成.tgz文件以保障生产环境解压可靠性,避免依赖缺失或版本漂移。

Composer 本身不提供元数据备份或归档功能,所谓“元数据备份压缩归档”必须手动实现,且格式选择直接决定恢复可靠性与自动化程度。
composer.json 和 composer.lock 必须一起归档
只备份 composer.json 没用——它只声明“想要什么”,而 composer.lock 才记录“实际装了什么”。丢掉后者,composer install 就会拉取最新兼容版本,行为不可控。常见错误是 CI 脚本里只 tar -cf backup.tar composer.json,结果部署时依赖漂移、测试通过但线上报 Class not found。
- 归档命令应显式包含两者:
tar -czf deps-20261103.tgz composer.json composer.lock - 若项目使用
vendor/目录提交(不推荐但存在),需额外确认是否要打包整个vendor/——体积大、易失效,不如保留 lock 文件后重装 - Git 用户注意:
.gitignore常忽略composer.lock,导致它没进仓库;归档前先git status --ignored确认
ZIP vs TAR.GZ:PHP 运行时环境决定解压可行性
选 ZIP 还是 TAR.GZ,关键看目标服务器能否可靠解压。PHP 的 ZipArchive 扩展在 Ubuntu 22.04+ / PHP 8.1+ 默认启用,但某些容器镜像(如 php:alpine)默认不带 zip 工具,unzip 命令不存在,而 tar 几乎总是可用。
- 用
tar -czf归档:解压只需tar -xzf,无额外依赖,适合生产部署脚本 - 用
zip归档:适合开发机本地备份或需要跨平台(Windows/macOS/Linux)双击解压的场景,但服务端恢复前必须检查which unzip - 避免使用
.7z或.rar:PHP 生态无标准支持,exec('7z x')易因路径、权限、编码失败
归档内容要不要包含 vendor/?
包含 vendor/ 的归档包体积大(常超百 MB),且违反 Composer 设计哲学——它本意是“可重现安装”,不是“二进制分发”。但某些离线环境(如金融内网、航天测控站)确实禁止外网访问,此时 vendor 归档是唯一选择。
- 若必须打包
vendor/,务必用--exclude='*.git' --exclude='tests' --exclude='docs'过滤冗余目录,否则体积翻倍 - 验证归档完整性:归档后立即执行
sha256sum deps-20261103.tgz并存为deps-20261103.tgz.sha256,恢复前比对 - 注意:
vendor/中可能含硬链接或符号链接(如某些扩展的bin/脚本),tar默认保留,zip默认展开为副本,行为不一致
真正容易被忽略的是时间戳和用户权限:tar 默认保留 composer.lock 的 mtime,但某些 CI 系统会重写文件时间;若归档用于审计,建议加 --format=posix 和 --owner=0 --group=0 统一归属,避免因 UID/GID 差异导致解压失败。


















