ThinkPHP 5.1 / PhalApi 老项目 Composer 兼容性修复:Composer 2 报错与 composer.lock 镜像污染

部署老 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-api2.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() 等已删除函数报错