由于 composer 官网在国外,国际出口带宽有限,导致中国内地开发者下载很慢甚至超时。composer install 加速已经有云计算大厂提供了,比如 阿里云腾讯云。而 getcomposer 没有好的加速方式,本地开发和 docker build 在第一步就卡住了,本文将介绍一种好办法。

内地 getcomposer 下载失败

结论

很简单,在官方域名后面加上 .mirrors.china-speed.org.cn(中国速度) 即可。

国外官方:

curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

中国速度:

curl -sS http://getcomposer.org.mirrors.china-speed.org.cn/installer | php -- --install-dir=/usr/local/bin --filename=composer

技术细节

分析 installer 源码可以发现:安装时会请求 getcomposer.org/versions,获得最新版下载地址:

{
    "stable": [{"path": "/download/1.9.1/composer.phar", "version": "1.9.1", "min-php": 50300}],
    "preview": [{"path": "/download/1.9.1/composer.phar", "version": "1.9.1", "min-php": 50300}],
    "snapshot": [{"path": "/composer.phar", "version": "f05e78aa9ee48a317142543da8b9c02613951273", "min-php": 50300}]
}

然后根据里面的地址下载 composer.phar,最后还会请求 composer.phar.sig 进行文件校验。

方案

第1步:云存储回源 getcomposer.org,配置:经常删除 versions(即可回源最新版),其他文件无需刷新(比如 download/); 第2步:给云存储套上 CDN,配置:/versions/installer 经常过期刷新,配置 HTTPS; 第3步:持续集成定时抓取最新版 https://getcomposer.org/installer,把里面的域名改成国内 CDN,放到云存储;

阿里云和腾讯云都做了 packagist.org 的镜像,而没做 getcomposer.org 的镜像,阿里云手动挑了几个文件供大家下载,一旦 versions 更新将导致安装失败。

大厂没做 getcomposer 镜像

大厂没提供,所以只能自己做。

实战

第1步:创建一个云存储,配置回源,本文以腾讯云存储为例。

腾讯云存储免费6个月 腾讯云存储回源设置

然后我们通过云存储赠送的子域名试一下,第一次请求返回302回源,第二次是200直接返回。

第一次302回源,第二次200

腾讯云存储生命周期规则

第2步:给云存储套上 CDN;

腾讯云存储-自定义加速域名 腾讯云-CDN 缓存配置 腾讯云-CDN 配置 HTTPS

第3步:在 CODING 持续集成(免费的 Jenkins 云服务) 中创建一个构建任务,定时抓取 https://getcomposer.org/installer

CODING Jenkins 云服务

CODING Jenkins 定时触发

Jenkinsfile 代码如下:

pipeline {
  agent any
  stages {
    stage('检出') {
      steps {
        checkout(
          [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
          userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]]
        )
      }
    }
    stage('构建') {
      steps {
        echo '构建中...'
        sh 'wget https://getcomposer.org/installer -O web/installer'
        sh 'sed -i "s|getcomposer.org\'|getcomposer.org.mirrors.china-speed.org.cn\'|g" web/installer'
        sh 'git diff'
        echo '构建完成.'
      }
    }
    stage('测试') {
      steps {
        echo '测试中...'
        sh 'php web/installer --install-dir=./ --filename=composer'
        sh './composer --version'
        echo '测试完成.'
      }
    }
    stage('部署') {
      steps {
        echo '部署中...'
        sh 'apt-get update && apt-get install -y python3-pip'
        sh 'pip3 install coscmd'
        sh "coscmd config -a $TENCENT_SECRET_ID -s $TENCENT_SECRET_KEY -b $TENCENT_BUCKET -r $TENCENT_REGION"
        sh 'coscmd upload web/installer /'
        echo '部署完成'
      }
    }
  }
}

鸣谢

感谢 腾讯云(免费6个月)七牛云(每月免费 10GB) 提供云存储和国内 CDN。

感谢 CODING 持续集成 提供免费的 Jenkins 云服务。

通过上述邀请链接注册,本站将获得流量奖励,供大家下载使用。