部署老 PHP 项目时,composer install 报错往往是 Composer 版本与框架不兼容,或者 lock 文件里记录了失效的镜像地址。
基本部署脚本
#!/bin/bash
cd /www/wwwroot/project || exit 1
git pull origin main
不依赖 cd 的写法:
git -C /www/wwwroot/project pull origin main
Composer 2 与 ThinkPHP 5.1 不兼容
典型错误:
topthink/think-installer v2.0.0 requires composer-plugin-api ^1.0
found composer-plugin-api[2.9.0]
原因:think-installer v2.0.0 只支持 Composer 1.x,而 Composer 2.x 内置的 composer-plugin-api 是 2.9.0。
确认版本:
composer -V
降级到 Composer 1(推荐)
composer self-update --1
# 或指定版本
composer self-update 1.10.27
然后:
composer install
如果项目目录里有 composer.phar(旧版本):
php composer.phar install
注意:Packagist 已于 2025-09-01 停止支持 Composer 1
对于无 composer.lock 的老项目,Composer 1 的 composer update 无法重新解析依赖,因为 Packagist 已不提供 Composer 1 格式的包数据。
如果 lock 文件还在,composer install 仍然可以按 lock 文件安装。
dev-master 是什么
"phalapi/task": "dev-master"
dev-master 表示直接跟踪 Git 仓库的 master 分支最新提交,不安装正式 release 版本。需要在 composer.json 里声明:
"minimum-stability": "dev"
才能安装。风险:每次 composer update 拉的内容不固定,接口可能变动。GitHub 默认分支改名后,新项目改用 dev-main。
composer.lock 里的阿里云镜像污染
如果 lock 文件在其他人的阿里云镜像环境下生成,里面会固化 dist URL:
"dist": {
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%"
}
执行 composer install 时 Composer 严格按照 lock 安装,会尝试从这个地址下载,触发:
Authentication required (mirrors.aliyun.com):
Username:
检测
grep -n "mirrors.aliyun.com" composer.lock
修复方案
方案 1:--prefer-source(推荐快速处理)
php composer.phar install --prefer-source
优先 git clone 源码,绕过 dist zip 下载,大多数情况能直接解决。
方案 2:重新生成 lock
rm composer.lock
rm -rf vendor
php composer.phar clear-cache
php composer.phar update
重新生成后验证:
grep "mirrors.aliyun.com" composer.lock
应该没有任何结果。
方案 3:从仓库恢复 lock
如果 lock 是仓库管理的:
git checkout composer.lock
然后再用 --prefer-source 安装。
PhalApi 2.x 依赖安装成功的标志
Generating autoload files
这行出现且后面没有 RuntimeException / Installation failed,说明安装成功。然后验证:
php -r "require 'vendor/autoload.php'; echo 'OK';"
PHP 版本建议
ThinkPHP 5.1 / ThinkCMF 5.1 / PhalApi 2.x 老项目:
- PHP 7.2 ~ 7.4:最稳定
- PHP 8.0+:可能遇到
each()、create_function()等已删除函数报错
